美文网首页
Python面向对象编程——实例属性和类属性

Python面向对象编程——实例属性和类属性

作者: SevenBy | 来源:发表于2018-02-12 00:14 被阅读16955次
    • 面向对象编程——实例属性和类属性
    >>> class Student(object):
    ...     name = 'student'
    ...
    >>> s = Student()  #创建实例
    >>> print(s.name)  #打印name属性,因为实例并没有name属性,所以会继续查找class的name属性
    student
    >>> print(Student.name)  #打印类的属性
    student
    >>> s.name = "Michael"  #给实例绑定name属性
    >>> print(s.name)   #实例的属性比类的属性的优先级更高
    Michael
    >>> print(Student.name)   #但是类的属性并未消失,仍然可以访问
    student
    >>> del s.name   #删除实例的属性
    >>> print(s.name)   #再次调用实例的属性,会从类中继承
    student
    
    • 从上面的例子可以看出,在编写程序的时候,千万不要对实例属性和类属性使用相同的名字,因为相同名称的实例属性将屏蔽掉所有的类属性,但是当你删除掉实例属性后,再使用相同的名称,访问到的将是类属性。

    • 类的属性可以增删(del)改(重新赋值)查(getattr、dict、dir()、直接打印),实例的属性也可以增删改查,如果实在命令行中那只是临时的。但是不建议在外边随便改。


    练习:

    为了统计学生人数,给累增加一个属性,每创建一个自动加一:

    #!/usr/bin/env python3
    # -*- coding: utf-8 -*-
    __author__='byx54192@gmail.com'
    
    class Student(object):
        count = 0
        def __init__(self, name):
            self.name = name
            Student.count+=1
    
    if Student.count != 0:
        print('测试失败0')
    else:
        bart = Student('Bart')
        if Student.count != 1:
            print('测试失败1!')
        else:
            lisa = Student('lisa')
            if lisa.count != 2:   #注意lisa实例并没有count属性,它就继续去class的count属性
                print('测试失败2!') 
            else:
                print('Students:', Student.count)
                print('测试通过!')
    

    给实例绑定一个方法

    class Student(object):
        pass
    
    >>> def set_age(self, age): # 定义一个函数作为实例方法
    ...     self.age = age
    ...
    >>> from types import MethodType
    >>> s.set_age = MethodType(set_age, s) # 给实例绑定一个方法
    >>> s.set_age(25) # 调用实例方法
    >>> s.age # 测试结果
    25
    

    给实例绑定一个属性

    class Student(object):
        pass
    
    >>> s = Student()
    >>> s.name = 'Michael' # 动态给实例绑定一个属性
    >>> print(s.name)
    Michael
    

    PS: 给一个实例绑定的方法,对另一个实例是不起作用的

    Python面向对象编程——实例属性和类属性

    相关文章

      网友评论

          本文标题:Python面向对象编程——实例属性和类属性

          本文链接:https://www.haomeiwen.com/subject/jxyqtftx.html