Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Python中为实例分配属性?_Python_Attributes_Properties_Instance_Variable Assignment - Fatal编程技术网

如何在Python中为实例分配属性?

如何在Python中为实例分配属性?,python,attributes,properties,instance,variable-assignment,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 还可以通过属性装饰器指定属性 >>> class Bar(object): @property

使用python,可以通过以下两种方法之一设置实例的属性:

>>> class Foo(object):
    pass

>>> a = Foo()
>>> a.x = 1
>>> a.x
1
>>> setattr(a, 'b', 2)
>>> a.b
2
还可以通过属性装饰器指定属性

>>> class Bar(object):
    @property
    def x(self):
        return 0


>>> a = Bar()
>>> a.x
0
我的问题是,如何将属性分配给实例

我的直觉是尝试这样的事情

>>> class Doo(object):
    pass

>>> a = Doo()
>>> def k():
    return 0

>>> a.m = property(k)
>>> a.m
<property object at 0x0380F540>
>>类Doo(对象):
通过
>>>a=Doo()
>>>def k():
返回0
>>>a.m=属性(k)
>>>上午

。。。但是,我有一个奇怪的属性对象。类似的实验产生了类似的结果。我的猜测是,在某些方面,属性与类的关系比与实例的关系更为密切,但我对内部工作机制的了解还不足以理解这里发生的事情。

在类已经创建之后,可以动态地将属性添加到类中:

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
类栏(对象):
def x(自我):
返回0
setattr(条,'x',属性(条)
打印条.x
# 
打印条().x
# 0
但是,不能在实例上设置属性,只能在类上设置属性。您可以使用实例来执行此操作:

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
类栏(对象):
def x(自我):
返回0
bar=bar()
setattr(条形图、类别图、属性图、属性图)
打印条.x
# 
打印条.x
# 0

有关详细信息,请参见。

您可以将属性直接指定给类对象:

>>> class Foo(object):
    pass    
>>> a = Foo()
>>> a.__class__
__main__.Foo    
>>> setattr(a.__class__, 'm', property(lambda self: 0))
>>> a.m
0 
>>> a.m = 24
AttributeError: can't set attribute
属性使用仅对类起作用的属性,因此 在所有情况下。但是,您可以在上使用描述符的组合 一个类,它将引用每个实例的函数

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

这里我们采用@agf的解决方案,并使用
lambda
函数来定义类属性

class A(object):
    pass

a = A()
a.__class__.f = property(lambda self: 57)
a.f  # 57

下面的文章提供了更多的上下文:

我很确定他们需要每个实例都有这个。你的建议将影响所有实例。啊!比我早1分钟!!:)+1@Ross-我知道,答案是这样的。将属性添加到实例中是不可能的。看到我链接的线程了吗。