我想创建一个具有某些属性的对象。我想动态添加它们。与向现有对象实例添加方法类似,但使用属性而不是方法。下面是一个简单的例子。
我喜欢动态创建:
class A():
@property
def a(self):
return self._a
@a.setter
def a(self, x):
self._a = 10*x
@property
def b(self):
return self._b
@b.setter
def b(self, x):
self._b = 10*x
Run Code Online (Sandbox Code Playgroud)
要使用方法来做到这一点,我会这样做:
class B():
def __init__(self):
for i in range(70,80):
self.__dict__[chr(i)] = types.MethodType(lambda self,x: x*i, self)
Run Code Online (Sandbox Code Playgroud)
对于我尝试过的属性:
class B():
def __init__(self):
for i in range(70,80):
def tmp(self, x):
self._x = i*x
self.__dict__[chr(i)] = property(fget=lambda self: self._i, fset=tmp)
Run Code Online (Sandbox Code Playgroud)
我也找到了types.DynamicClassAttribute,但我不确定这是否有帮助。
这里提出了一个相关问题,关于向类添加属性(在 python 2 中): Dynamically add @property in python。我不知道如何将其扩展到类的实例。
我想为lantz项目编写一个“驱动程序”,以通过PyPylon包装器使用相机。相机具有一些事先不知道的属性。我想将所有属性添加为 Feats(由 lantz 提供的一些装饰器,它看起来类似于属性:它有一个 getter 和一个 setter)。
编辑:它看起来像如何动态向类添加属性?是同样的问题
这个评论给出了答案的暗示。
follow 函数(受1启发)将属性添加到类的单个实例。它通过动态创建一个新类来实现这一点。
def attach_dyn_propr(instance, prop_name, propr):
"""Attach property proper to instance with name prop_name.
Reference:
* /sf/answers/94881111/
* /sf/ask/3391365211/
"""
class_name = instance.__class__.__name__ + 'Child'
child_class = type(class_name, (instance.__class__,), {prop_name: propr})
instance.__class__ = child_class
Run Code Online (Sandbox Code Playgroud)
示例和测试:
def getter(self): print('Get!')
def setter(self, value): print('Set to {!r}!'.format(value))
def deleter(self): print('Delete!')
prop = property(getter, fset=setter, fdel=deleter)
class Foo: pass
foo = Foo()
foo2 = Foo()
attach_dyn_propr(foo, 'p', prop)
foo.p
foo2.p
... Get
... AttributeError: 'Foo' object has no attribute 'p'
Run Code Online (Sandbox Code Playgroud)