![](/img/trans.png)
[英]How to pass an instance of a class into attributes within its constructor and have those attributes access initialized attributes?
[英]How to pass a callable to a class so that it can access instance attributes in Python?
假设我有这个 class:
class ClassA:
def __init__(self, callable):
self.name = "Hey!"
self.callable = callable
def call(self):
self.callable()
我想将一个可以访问name
的 function 传递给callable
的:
def function_a():
print(f"{self.name}")
所以这
a = ClassA(function_a)
a.call()
产生这个:
Hey!
我应该如何 go 关于这个? 元分类? Class 装饰? 还是我应该彻底检查我的架构,这样我就不需要做这样的事情了?
使用更清晰的示例进行编辑
前一个示例似乎我只是想访问该属性,事实并非如此。 在更复杂的演示中,考虑一下:
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
是在 class 之外定义的可调用对象,需要以某种方式访问该 object 属性。
啊啊啊,就在我写这篇文章的时候,我意识到我想要的实际上非常简单,我只需要让selection_strategy
接受我想要的 arguments 从 class 中调用它并在select
中调用它。 对不起,我已经工作了几个小时,这完全被我忽略了。
谢谢!
我想知道这是否有任何实际用途,但你可以使用
...
def call(self):
self.callable(self)
def function_a(cls):
print(f"{cls.name}")
a = ClassA(function_a)
a.call()
# Hey!
这似乎是一个糟糕的主意,但在这里你 go
>>> def hello():
... print 'hello: '+name
...
>>> hello()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 2, in hello
NameError: global name 'name' is not defined
>>> exec hello.func_code in {'name':'bob'}
hello: bob
>>>
由于尚不清楚这有什么意义,因此很难知道哪种答案会奏效。 然而,除了“可调用”带参数的明显想法之外,最简单的事情是定义一个可调用 class
Class callable(object):
def __init__(self, otherclass):
self.name = otherclass.name
def _call__(self):
print(self.name)
然后实例化它
foo = callable(ClassAInstance)
可调用对象不能正式成为方法,因为方法必须在 class object 本身上定义。 但它真的必须是一种方法吗? 您可以将可调用对象定义为常规的 function ,采用恰好是实例对象的self
引用的单个参数。 命名空间解析不同 - 您不能使用 class 级别变量 - 但如果这不是问题,这将起作用:
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()
如果您希望 function 能够使用 self,则必须将其设为方法,如下所示:
class ClassA:
def __init__(self):
self.name = "Hey!"
self.callable = self.function_a
def call(self):
self.callable()
def function_a(self):
print(f"{self.name}")
或者,您可以将名称作为参数传递:
class ClassA:
def __init__(self):
self.name = "Hey!"
self.callable = self.function_a
def call(self):
self.callable(self.name)
def function_a(name):
print(f"{name}")
a = ClassA(function_a)
a.call()
希望这可以帮助!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.