如何以编程方式设置python实例方法
我有一个制作匿名类的类:如何以编程方式设置python实例方法,python,Python,我有一个制作匿名类的类: class Anonyclass(object): def __init__(self, **kwargs): for kwarg in kwargs: self.__setattr__(kwarg, kwargs[kwarg]) 它非常适合动态设置属性,但是我不能这样设置实例方法,因为它们不能访问self。e、 g.Anonyclass(foo=lambda x:x**2).foo(5)==25,但我似乎无法将一个se
class Anonyclass(object):
def __init__(self, **kwargs):
for kwarg in kwargs:
self.__setattr__(kwarg, kwargs[kwarg])
它非常适合动态设置属性,但是我不能这样设置实例方法,因为它们不能访问self
。e、 g.Anonyclass(foo=lambda x:x**2).foo(5)==25
,但我似乎无法将一个self
推到那里
有人知道如何做到这一点吗?你可以像下面这样做。您可能必须修改kwarg的
,kwargs.items()中的值:
循环,以检查分配的值类型,并以不同方式处理属性的数据和/或属性类型。因为在你的问题中没有任何例子,所以我没有尝试其他任何东西
class _Callable(object):
def __init__(self, instance, name, value):
self.name = name
self.instance = instance
self.__setattr__(name, value)
def __call__(self, *args):
return self.__dict__[self.name](self.instance, *args)
class AnonyClass(object):
def __init__(self, **kwargs):
for kwarg, value in kwargs.items():
setattr(self, kwarg, _Callable(self, kwarg, value))
value = 6.480740698407860230965967436088
print( AnonyClass(foo=lambda self, x: x**2).foo(value) ) # -> 42.0
你可以这样做。您可能必须修改kwarg的
,kwargs.items()中的值:
循环,以检查分配的值类型,并以不同方式处理属性的数据和/或属性类型。因为在你的问题中没有任何例子,所以我没有尝试其他任何东西
class _Callable(object):
def __init__(self, instance, name, value):
self.name = name
self.instance = instance
self.__setattr__(name, value)
def __call__(self, *args):
return self.__dict__[self.name](self.instance, *args)
class AnonyClass(object):
def __init__(self, **kwargs):
for kwarg, value in kwargs.items():
setattr(self, kwarg, _Callable(self, kwarg, value))
value = 6.480740698407860230965967436088
print( AnonyClass(foo=lambda self, x: x**2).foo(value) ) # -> 42.0
这并不是创建新的“类”,而是创建Anonyclass
的实例。
正如您可以设置实例属性一样,您可以设置可调用的属性,这些属性知道它们绑定到哪个实例
因此,假设作为参数传递的任何可调用函数都将self
作为第一个参数,您可以将代码更改为:
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)
这是必需的,因为在实例中设置的可调用函数绕过了将“self”参数自动添加到所有调用的过程。所以我们使用functools.partial
来做同样的事情。(可以使用lambda完成,但我们需要两个级别的lambda,以便“attr”变量将自身绑定到正确的方法,而不是指向for
循环中指定的最后一个元素)
此外,如果您希望实际创建类而不是绑定属性的实例,您可以调用type
,在代码上传递与kwargs
相同的参数:
def anon_class_factory(**kwargs):
return type("Anonyclass", (object,), kwargs)
这将使传入的任何函数都像一个“真实”方法一样工作。这不是创建新的“类”,而是创建Anonyclass的实例。
正如您可以设置实例属性一样,您可以设置可调用的属性,这些属性知道它们绑定到哪个实例
因此,假设作为参数传递的任何可调用函数都将self
作为第一个参数,您可以将代码更改为:
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)
这是必需的,因为在实例中设置的可调用函数绕过了将“self”参数自动添加到所有调用的过程。所以我们使用functools.partial
来做同样的事情。(可以使用lambda完成,但我们需要两个级别的lambda,以便“attr”变量将自身绑定到正确的方法,而不是指向for
循环中指定的最后一个元素)
此外,如果您希望实际创建类而不是绑定属性的实例,您可以调用type
,在代码上传递与kwargs
相同的参数:
def anon_class_factory(**kwargs):
return type("Anonyclass", (object,), kwargs)
这将使在kwargs
中传递的任何函数都像“real”方法一样工作。的可能重复项的可能重复项要使其工作,您必须在Anonyclass中传递self
参数。\uuuuu init\uuuuu
也传递给\uCallable
实例。@jsbueno:True且已修复。谢谢你指出这一点。没有注意到,因为testcase函数/方法没有访问它的self
参数。为此,您必须在Anonyclass中传递self
参数。\uuuuuu init\uuuu
也传递给\uCallable
实例。@jsbueno:True和fixed。谢谢你指出这一点。没有注意到,因为testcase函数/方法没有访问其self
参数。