【问题标题】:Creating an object and passing an user-defined function as method [duplicate]创建对象并将用户定义的函数作为方法传递[重复]
【发布时间】:2019-09-18 05:34:15
【问题描述】:

让我们假设以下情况:我有一个具有一些初始值的类。此外,我想在初始化新对象时提供传递用户定义方法的可能性。用户提前知道类的属性,可能希望在函数中考虑它们,例如:

class some_class():
    def __init__(self, some_method):
        # some initial values
        self.a = 8
        self.b = 12
        # initializing a new object with a user-specific method
        self.some_method = some_method 

    def some_method(self):
        pass # this method shall be specified by the user

# user-specific function
def some_function(): 
    return self.a + self.b

some_object = some_class(some_method = some_function)
print(some_object.some_method())

当然,给定的示例不起作用,但我希望它显示了我想要做的事情。我正在寻找一种在类外定义函数的方法,该函数是指初始化期间传递的对象的属性。

我尽量避免使用固定名称约定来解决问题,例如:

class some_class():
    def __init__(self, some_method):
        self.a = 8
        self.b = 12
        self.some_method = some_method 

    def some_method(self):
        pass

def some_function(): 
    return some_object.a + some_object.b # -> fixed names to avoid the problem

some_object = some_class(some_method = some_function)
print(some_object.some_method())

我认为我需要的是一种占位符或自我的替代品。有人有想法吗?

【问题讨论】:

  • 如果你希望用户在使用你的类时提供额外的代码,他们应该继承它而不是仅仅实例化它。
  • 您要做的是将函数绑定到对象。看到这个问题:stackoverflow.com/questions/1015307/…
  • 确实,但它是可行的。我的意思是,这是python,各种loopyland的事情都是可能的。
  • 感谢大家的许多建议。然而,布鲁斯是对的。跟随他的链接后,我意识到这正是我所搜索的。我只是不知道它叫什么,我搜索了什么

标签: python python-3.x


【解决方案1】:

这可行,但不确定它是否是实现您想要的最优雅的方式:

class some_class():
    def __init__(self, some_method):
        self.a = 8
        self.b = 12
        self.some_method_func = some_method

    def some_method(self):
        return self.some_method_func(self)

def some_function(self):
    return self.a + self.b

some_object = some_class(some_method = some_function)
print(some_object.some_method())

【讨论】:

【解决方案2】:

如果我没看错,那么简单的选择就是执行以下操作:

class some_class():
    def __init__(self):
        self.a = 8
        self.b = 12

    def some_method(self):
        pass

def my_method(self):
    return self.a + self.b

# Redefine the class method
some_class.some_method = my_method

# Or, if you only want to do it for a specific instance:

instance = some_class()
instance.some_method = my_method

“正确”执行此操作的通常方法是使用子类化。

【讨论】:

    【解决方案3】:

    您需要让班级和班级的调用者同意合同。约定是类将类的实例传递给函数,函数必须接受它作为参数。

    class some_class():
        def some_method(self):
            return self.some_method_func(self)
    
    def some_function(obj):
       return obj.a + obj.b
    

    【讨论】:

      猜你喜欢
      • 2015-11-15
      • 1970-01-01
      • 2015-03-04
      • 1970-01-01
      • 2015-08-17
      • 2014-06-07
      • 1970-01-01
      • 2020-02-28
      • 1970-01-01
      相关资源
      最近更新 更多