假设我有这个课:
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()