如何将可调用对象传递给类,以便它可以访问Python中的实例属性?

假设我有这个课:

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

    def call(self):
        self.callable()

And I want to pass into callable a function that can access name:

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

这样

a = ClassA(function_a)
a.call()

产生此:

Hey!

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

谢谢!

评论
半面妆
半面妆

我想知道这是否有任何实际用途,但是您可以使用

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

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

a = ClassA(function_a)
a.call()
# Hey!
点赞
评论
红颜祸水
红颜祸水

这似乎是一个可怕的主意,但是你去了

>>> 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
>>>
点赞
评论
动感光波
动感光波

如果希望函数能够使用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()

希望这可以帮助!

点赞
评论