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(…)
。