Discuss / Python / 交个作业

交个作业

Topic source

类属性和实例属性其实是两个不同的对象,因为在将类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

波风若川

#2 Created at ... [Delete] [Delete and Lock User]

很棒

Zflyee

#3 Created at ... [Delete] [Delete and Lock User]

解释的很棒呀!

给实例对象s添加属性,再通过dir()查看会发现,age只存在“子类”s中,并没有出现在“基类”Student中,再给“基类”添加属性试试:

基类中增加属性,为啥先前的对象中也增加了呢?怎么理解呢

弄明白了,因为在class中定义属性,这种属性是类属性,归Student类所有,而不是对象所有


  • 1

Reply