类属性和实例属性其实是两个不同的对象,因为在将类Student赋值给s时,其实s就好像是Student类的一个子类,继承Student的全部,因为他们的内存地址并不是指向同一个位置,如下所示:
>>> class Student(object): name = 'Student' >>> s=Student() >>> id(Student) 42362760 >>> id(s) 45692856
通过使用id()来查看他们的地址,可以看出是不同的。所以当给“子类”s添加属性的时候,这个属性只属于它自己,不会涉及到“基类”Student如下所示:
>>> s.age=88 >>> dir(s) ['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'age', 'name'] >>> dir(Student) ['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'name'] >>>
给实例对象s添加属性,再通过dir()查看会发现,age只存在“子类”s中,并没有出现在“基类”Student中,再给“基类”添加属性试试:
>>> Student.sex=666 >>> dir(Student) ['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'name', 'sex'] >>> dir(s) ['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'age', 'name', 'sex'] >>>
新属性sex在两个对象中同时出现了。比如给s.name赋值,获取的一定是刚刚赋值的新内容,而不是Student中的,但是删除s.name那么再获取s.name就会找到“基类”Student中的值,如下所示:
>>> s.name="bob" >>> s.name 'bob' >>> del s.name >>> s.name 'Student' >>>
不知道我这么理解对不对,如有问题请指正。下面是作业:
class Student(object): count = 0 def __init__(self, name): self.name = name Student.count += 1
很棒
解释的很棒呀!
基类中增加属性,为啥先前的对象中也增加了呢?怎么理解呢
弄明白了,因为在class中定义属性,这种属性是类属性,归Student类所有,而不是对象所有
Sign in to make a reply
Destiny_Raymond
类属性和实例属性其实是两个不同的对象,因为在将类Student赋值给s时,其实s就好像是Student类的一个子类,继承Student的全部,因为他们的内存地址并不是指向同一个位置,如下所示:
通过使用id()来查看他们的地址,可以看出是不同的。所以当给“子类”s添加属性的时候,这个属性只属于它自己,不会涉及到“基类”Student如下所示:
给实例对象s添加属性,再通过dir()查看会发现,age只存在“子类”s中,并没有出现在“基类”Student中,再给“基类”添加属性试试:
新属性sex在两个对象中同时出现了。比如给s.name赋值,获取的一定是刚刚赋值的新内容,而不是Student中的,但是删除s.name那么再获取s.name就会找到“基类”Student中的值,如下所示:
不知道我这么理解对不对,如有问题请指正。下面是作业: