python类属性

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__.