假设我有这个课:

class ClassA:
    def __init__(self, callable):
        self.name = "Hey!"
        self.callable = callable

    def call(self):
        self.callable()

我想将可以访问name的函数传递给callable

def function_a():
    print(f"{self.name}")

这样

a = ClassA(function_a)
a.call()

产生此:

Hey!

我应该怎么做?元分类?类装饰?还是我应该彻底改革我的体系结构,以使我不需要做这样的事情?

用更清晰的示例进行编辑

前一个例子似乎是我在尝试访问该属性,事实并非如此。在更复杂的demo中,请考虑以下事项:

class ClassA:
    def __init__(self, selection):
        self.numbers = [randint(1, 100) for _ in range(10)]
        self.selection = selection

    def select(self):
        return self.selection(self.numbers)

然后假设我希望呼叫者能够提供 选择这些数字的不同策略,例如

a = ClassA(selection_strategy)
a.select()

在该架构中,selection_strategy是可调用的定义 在课堂之外需要以某种方式访问 对象属性。

就像我在写这篇文章时,我意识到我想要的是 其实很简单,我只需要制作selection_strategy 从类中接受我想要的参数并在其中调用 select。抱歉,SO, I已经工作了几个小时 这完全被我溜走了。

谢谢!

分析解答

可调用对象不能正式是方法,因为方法必须在类对象本身上定义。但这真的必须是一种方法吗?您可以将可调用对象定义为带有单个参数的常规函数​​,而该参数恰好是实例对象的self引用。命名空间解析不同-您不能使用类级别的变量-但这不是问题,它将起作用:

class ClassA:
    def __init__(self, callable):
        self.name = "Hey!"
        self.callable = callable

    def call(self):
        self.callable(self)

def function_a(self):
    print(f"{self.name}")

a = ClassA(function_a)
a.call()