Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/329.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 - Fatal编程技术网

如何以编程方式设置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
参数。