Cea*_*sta 5 python attributes properties instance variable-assignment
使用python,可以通过以下两种方法之一设置实例的属性:
>>> class Foo(object):
pass
>>> a = Foo()
>>> a.x = 1
>>> a.x
1
>>> setattr(a, 'b', 2)
>>> a.b
2
Run Code Online (Sandbox Code Playgroud)
还可以通过属性装饰器分配属性.
>>> class Bar(object):
@property
def x(self):
return 0
>>> a = Bar()
>>> a.x
0
Run Code Online (Sandbox Code Playgroud)
我的问题是,如何为实例分配属性?
我的直觉是尝试这样的事情......
>>> class Doo(object):
pass
>>> a = Doo()
>>> def k():
return 0
>>> a.m = property(k)
>>> a.m
<property object at 0x0380F540>
Run Code Online (Sandbox Code Playgroud)
...但是,我得到了这个奇怪的属性对象.类似的实验产生了类似的结果.我的猜测是,在某些方面,属性与类的关系比实例更密切,但我不清楚内部工作是否足以理解这里发生了什么.
可以在类创建后动态地向类添加属性:
class Bar(object):
def x(self):
return 0
setattr(Bar, 'x', property(Bar.x))
print Bar.x
# <property object at 0x04D37270>
print Bar().x
# 0
Run Code Online (Sandbox Code Playgroud)
但是,您不能在实例上设置属性,只能在类上设置。你可以使用一个实例来做到这一点:
class Bar(object):
def x(self):
return 0
bar = Bar()
setattr(bar.__class__, 'x', property(bar.__class__.x))
print Bar.x
# <property object at 0x04D306F0>
print bar.x
# 0
Run Code Online (Sandbox Code Playgroud)
请参阅如何动态地向类添加属性?想要查询更多的信息。
属性使用的描述符仅适用于类,因此适用于所有实例。但是您可以在类上使用描述符的组合来查询每个实例的函数。
>>> class Foo(object):
... @property
... def x(self):
... if 'x' in self.__dict__:
... return self.__dict__['x'](self)
...
>>> a = Foo()
>>> def k(self):
... return 0
...
>>> a.__dict__['x'] = k
>>> a.x
0
Run Code Online (Sandbox Code Playgroud)