创建对象并将用户定义的函数作为方法传递

时间:2019-04-29 14:58:08

标签: python python-3.x

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

- Pasta Salad
- Description:
    bla
    bla

- Ingredients:
* ingredient 1
* ingredient 2
* ingredient 3

- Preperation:
    bla
    bla
    bla

- Ingredients:
* ingredient 4
* ingredient 5
* ingredient 6

当然,给定的示例不起作用,但我希望它能说明我想做什么。我正在寻找一种在类外部定义函数的方法,该函数引用在初始化期间传递对象后的对象属性。

我试图避免的是解决具有固定名称约定的问题,例如:

[['ingredient 1', 'ingredient 2', 'ingredient 3'], 
['ingredient 4', 'ingredient 5', 'ingredient 6']]

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

3 个答案:

答案 0 :(得分:6)

这行得通,尽管不确定这是实现所需目标的最优雅方法:

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

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

您需要获得课程和课程的调用者才能同意合同。约定是该类将类的实例传递给该函数,并且该函数必须接受该类作为参数。

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

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