这不是创造新的“类”只是Anonyclass
实例。 正如您可以设置实例属性一样,您可以设置知道它们绑定到哪个实例的可调用属性。
from functools import partial
class Anonyclass(object):
def __init__(self, **kwargs):
for kwarg, attr in kwargs.items():
if callable(attr):
attr = partial(attr, self)
setattr(self, kwarg, attr)
需要这个,因为可赎回的情况下被设置绕过mechanism Python uses to bind a method to an instance汽车:
因此,假设所有可调用作为参数,将采取self
作为第一个参数传递,你可以改变你的代码 - 为所有呼叫添加“自我”参数。所以我们使用functools.partial
来做同样的事情。 (这可以用lambda来完成,但是我们需要两个lambda级别,以便“attr”变量保持自己绑定到正确的方法,而不是指向在for
循环中分配的最后一个元素)
另外,如果你想真正创建类和不绑定的属性的情况下,你可以只需打个电话给type
,传递你的kwargs
您的代码相同的参数:
def anon_class_factory(**kwargs):
return type("Anonyclass", (object,), kwargs)
这将使任何在kwargs
中传递的函数表现为“真实”的方法。
[将方法添加到现有对象实例](https://stackoverflow.com/questions/972/adding-a-method-to-an-existing-object-instance) –