九州体育网 - 十年信誉网站

关于作者

Discuss / Python / 关于实例属性和类属性的疑惑

关于实例属性和类属性的疑惑

Topic source

ChrisGardner88

#1 Created at ...

class Student(object): ... name = 'Student' ... s = Student() # 创建实例s print(s.name) # 打印name属性,因为实例并没有name属性,所以会继续查找class的name属性 Student print(Student.name) # 打印类的name属性 Student s.name = 'Michael' # 给实例绑定name属性 print(s.name) # 由于实例属性优先级比类属性高,因此,它会屏蔽掉类的name属性 Michael print(Student.name) # 但是类属性并未消失,用Student.name仍然可以造访 Student del s.name # 如果删除实例的name属性 print(s.name) # 再次调用s.name,由于实例的name属性没有找到,类的name属性就显示出来了 Student

1、为什么实例没有name属性?既然实例是根据类创建的,类有name属性,那实例怎么会没有? 2、分不清实例属性和类属性的区别。

ChrisGardner88

#2 Created at ...

student = Student() print(dir(student)) print(hasattr(student, "name"))

第一个打印出来是True,第二个在列表的最后一个元素是“name”。那为什么老师说实例没有name属性?新手,实在搞不懂这些问题。

蒋智9527

#3 Created at ...

所有实例公用类属性,而每个实例都拥有自己的实例属性

blablahbala

#4 Created at ...

个人理解,不必name吧,换个变量名knowledge。

类Professor里边有一个属性knowledge,因为定义的时候没有用self.knowledge而是直接用knowledge,所以这个属性是Professor.knowledge。

然后Professor有个实例lurenjia,他从类里面学到了知识(继承了类的属性knowledge),所以他有了自己的属性lurenjia.knowledge,且值与Professor.knowledge相等。

但是他想对知识进行修改的时候,只能修改自己脑海里的知识,改不了别人脑子里的知识,所以lurenjia.knowledge被修改了,Professor.knowledge还是不变。


  • 1

Reply

WARNING: You are using an old browser that does not support HTML5. Please choose a modern browser (Chrome / Microsoft Edge / Firefox / Sarafi) to get a good experience.