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

Python 如何在类中绑定用户提供的方法';谁的构造函数?

Python 如何在类中绑定用户提供的方法';谁的构造函数?,python,class,methods,dynamic,Python,Class,Methods,Dynamic,我正在设计一个类,我想让用户在初始化该类的实例时可以指定该类的一个方法 一个简单的例子如下: class MyClass: def __init__(self, supplied_method): self.a = 2 # what more goes here? def my_fun(self): print(self.a) my_object = MyClass(my_fun) my_object.my_fun() 预期产量 2

我正在设计一个类,我想让用户在初始化该类的实例时可以指定该类的一个方法

一个简单的例子如下:

class MyClass:
    def __init__(self, supplied_method):
        self.a = 2
        # what more goes here?


def my_fun(self):
    print(self.a)


my_object = MyClass(my_fun)
my_object.my_fun()
预期产量

 2

我在构造函数中尝试了
self.my_-fun=my_-fun
,但是
self
参数并没有被自动提供给实例。我还知道,可以使用
MethodType
在类定义之外绑定方法
my_fun
,但我想在构造函数中绑定它。

您必须将提供的函数绑定到该特定实例。可以通过调用函数上的来执行此操作:

class MyClass:
    def __init__(self, supplied_method):
        self.a = 2
        bound = supplied_method.__get__(self, type(self))
        setattr(self, supplied_method.__name__, bound)
我假设您希望实例上的属性使用与传入的函数相同的名称;请注意,当提供的
方法
是lambda时,这将导致难以使用
属性

演示:

对于“普通”方法,其中函数是类的属性,实例上的属性访问被委托给类对象,该对象为您处理描述符绑定。请参阅。

您必须将提供的函数绑定到该特定实例。可以通过调用函数上的来执行此操作:

class MyClass:
    def __init__(self, supplied_method):
        self.a = 2
        bound = supplied_method.__get__(self, type(self))
        setattr(self, supplied_method.__name__, bound)
我假设您希望实例上的属性使用与传入的函数相同的名称;请注意,当提供的
方法
是lambda时,这将导致难以使用
属性

演示:


对于“普通”方法,其中函数是类的属性,实例上的属性访问被委托给类对象,该对象为您处理描述符绑定。请参阅。

谢谢您抽出时间!这就解决了问题。我有一个问题(不幸的是在写了这个问题之后):在
MyClass
的构造函数中编写
MyClass.supplied\u method=supplied\u method
来绑定所提供的方法怎么样?@JLagana:那么该类的所有实例都将共享该方法。@JLagana:这与每个具有自定义绑定方法的实例不同
instance1=MyClass(foo)
将首先设置class属性,然后
instance2=MyClass(bar)
将设置相同的class属性,并且
instance1.supplied_method()
instance2.supplied_method()
将调用
bar(…)
。谢谢您的时间!这就解决了问题。我有一个问题(不幸的是在写了这个问题之后):在
MyClass
的构造函数中编写
MyClass.supplied\u method=supplied\u method
来绑定所提供的方法怎么样?@JLagana:那么该类的所有实例都将共享该方法。@JLagana:这与每个具有自定义绑定方法的实例不同
instance1=MyClass(foo)
将首先设置class属性,然后
instance2=MyClass(bar)
将设置相同的class属性,并且
instance1.supplied_method()
instance2.supplied_method()
将调用
bar(…)