chn*_*net 17 python attributes class
我有一个关于python中的类属性的问题.
class base :
def __init__ (self):
pass
derived_val = 1
t1 = base()
t2 = base ()
t2.derived_val +=1
t2.__class__.derived_val +=2
print t2.derived_val # its value is 2
print t2.__class__.derived_val # its value is 3
Run Code Online (Sandbox Code Playgroud)
结果不同.我还使用id()函数来查找t2.derived_val和t2.class .derived_val有不同的内存地址.我的问题是derived_val是class属性.为什么上面的例子有所不同?是因为类的实例在类属性旁边复制了自己的derived_val吗?
unu*_*tbu 40
有类属性和实例属性.当你说
class base :
derived_val = 1
Run Code Online (Sandbox Code Playgroud)
您正在定义一个类属性.derived_val成为关键
base.__dict__.
t2=base()
print(base.__dict__)
# {'derived_val': 1, '__module__': '__main__', '__doc__': None}
print(t2.__dict__)
# {}
Run Code Online (Sandbox Code Playgroud)
当你说t2.derived_valPython试图找到'derived_val'时t2.__dict__.由于它不在那里,它看起来'derived_val'在任何基t2类中都有一个键.
print(t2.derived_val)
print(t2.__dict__)
# 1
# {}
Run Code Online (Sandbox Code Playgroud)
但是,当您为其分配值时t2.derived_val,您现在正在添加实例属性t2.一derived_val键添加到t2.__dict__.
t2.derived_val = t2.derived_val+1
print(t2.derived_val)
print(t2.__dict__)
# 2
# {'derived_val': 2}
Run Code Online (Sandbox Code Playgroud)
请注意,此时有两个derived_val属性,但只能轻松访问实例属性.只有通过引用base.derived_val或直接访问类dict才能访问class属性base.__dict__.