【问题标题】:How to bind user-supplied method when in the class's constructor?在类的构造函数中如何绑定用户提供的方法?
【发布时间】:2019-12-10 23:15:25
【问题描述】:

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

一个简单的例子是这样的:

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 outside,但我想在构造函数中绑定它。

【问题讨论】:

    标签: python class methods dynamic


    【解决方案1】:

    您必须将提供的函数绑定到该特定实例。您可以通过调用函数上的__get__ descriptor method 来实现:

    class MyClass:
        def __init__(self, supplied_method):
            self.a = 2
            bound = supplied_method.__get__(self, type(self))
            setattr(self, supplied_method.__name__, bound)
    

    我假设您希望实例上的属性使用与传入的函数相同的名称;请注意,当 supplied_method 是 lambda 时,这将导致难以使用的 <lambda> 属性!

    演示:

    >>> class MyClass:
    ...     def __init__(self, supplied_method):
    ...         self.a = 2
    ...         bound = supplied_method.__get__(self, type(self))
    ...         setattr(self, supplied_method.__name__, bound)
    ...
    >>> def my_fun(self):
    ...     print(self.a)
    ...
    >>> my_object = MyClass(my_fun)
    >>> my_object.my_fun()
    2
    

    对于'普通'方法,函数是的一个属性,实例的属性访问被委托给类对象,它为你处理描述符绑定。见descriptor HOWTO

    【讨论】:

    • 感谢您的宝贵时间!这解决了问题。我有一个问题(不幸的是在写完这个问题之后):在MyClass 的构造函数中写MyClass.supplied_method = supplied_method 来绑定提供的方法怎么样?
    • @JLagana:那么类的 所有 个实例将共享该方法。
    • @JLagana:这与每个具有自定义绑定方法的单个实例不同。 instance1 = MyClass(foo) 会先设置类属性,然后instance2 = MyClass(bar) 会设置相同的类属性,instance1.supplied_method()instance2.supplied_method() 都会调用bar(...)
    猜你喜欢
    • 2018-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多