python新手求教:关于类属性的问题
#coding:utf-8
class Person:
name="人"
def __init__(self):
self.name="self"
if __name__ == "__main__":
p = Person()
print p.name
print Person.name
类属性难道不是所有对象共有的吗?self.name="" 这样一用之后,name到底是类属性还是对象属性,为什么最后Person.name的值并没有改变啊?
刚刚开始学python,很多不解之处,望大神指教啊!!!
[解决办法]
python的机制是这样的,实例没有name就会参照类的name,但是一旦self.name=xxx之后,实例自身会建立一个专属的name,一般这种需求比较普遍,就像你写的代码,按逻辑每个实例的name应该是不同的而不是要共享。如果是要共享就显式地写成Person.name=xxx,不过你最好参考内建函数property()的用法建立属性name,改变默认机制,这样外部在使用p.name=xxx时,不至于又成了实例自身的属性...
[解决办法]
你应该是看中文文档看晕了,Python的类的方法和C++一样,静态方法和非静态的方法。静态方法需要前面加@staticmethod声明,非静态方法和C++一样。调用的时候,静态的用类名调,非静态的用对象调。在类里面,是不需要对非静态成员声明的。所以的你Person里面name="人",这个是静态成员,编译器识别大概为@Person_static_name。但是__init__方法中出现了self.name这个时候,他也会创建一个成员,编译器识别大概为@Person_name,虽然两者看似名称相似,但是编译器识别的符号不同,所以是不会覆盖的。下面你调用的时候,用对象调的就是成员,类名调的就是静态成员。所以产生你看到的结果。