如何将可调用对象传递给类,以便它可以访问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()
    

    希望这可以帮助!