3

我有一个具有记录器实例变量的类,我正在其中创建另一个类,我想在该类中使用记录器实例变量,但不知道如何调用它。

示例代码:

class A():
    def __init__(self):
        self.logger = Logger.get() #this works fine didn't include the Logger class

    def func(self):
        class B():
            def __init__(self):
                self.a = 'hello'
            def log(self):
            #How do I call A's logger to log B's self.a
            #I tried self.logger, but that looks inside of the B Class
4

2 回答 2

7

正如 Python 之禅所说,“扁平胜于嵌套”。您可以取消嵌套B,并将记录器作为参数传递给B.__init__. 通过这样做,

  • 你明确了哪些变量B取决于什么。
  • B单元测试变得更容易
  • B可以在其他情况下重复使用。

class A():
    def __init__(self):
        self.logger = Logger.get() #this works fine didn't include the Logger class

    def log(self):
        b = B(self.logger)

class B():
    def __init__(self, logger):  # pass the logger when instantiating B
        self.a = 'hello'
于 2013-07-22T20:56:28.073 回答
5

名称self不是语言要求,它只是一种约定。您可以使用不同的变量名称,a_self这样外部变量就不会被屏蔽。

class A():
    def __init__(self):
        self.logger = Logger.get() #this works fine didn't include the Logger class

    def func(a_self):
        class B():
            def __init__(self):
                self.a = 'hello'
            def log(self):
                a_self.logger.log('...')
于 2013-07-22T20:46:15.000 回答