2013-07-22 53 views
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 

回答

7

正如Python的禪狀態所示,「Flat比嵌套更好」。您可以取消嵌套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' 
+0

+1爲Python的禪! – Ben

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('...')