2013-07-16 62 views
0

我寫一些代碼,有大約蟒蛇在Python函數和類一類的內部

一個普遍的問題。如果我有這樣的事情裏面範圍類:

class A(): 
     def __init__(self): 
      self.name 
      ... 
     def doSomething(self): 
      class B(): 
       def __init__(self): 
        self.name 
        ... 
      c = B() 
      c.whatever() 

這是否意味着那個類B只對那個函數是私有的,還是可以從類A的一個實例中調用它呢?關於這一點,如果我有一些像這樣的代碼:

class A(): 
    class B(): 
     def __init__(self): 
      self.name 

    def __init__(self): 
     self.name 
     ... 
     def doSomething(self): 
     ...  

我可以做這個d = A.B()正確的稱呼呢?

回答

1

需要認識的是,class語句只是創建一個變量,其值是一個類。結果類的作用域的工作方式與變量作用域的工作方式相同,如果您只執行一個像x = 2這樣的普通變量賦值。

除非另有指定,否則在函數內部創建的任何變量都是該函數的本地變量。因此,在函數內使用class聲明只會創建一個其值爲一個類的局部變量。它不能從函數外部訪問。

換句話說,這樣的:

def foo(): 
    class A(object): 
     pass 

是不是從這次真的不同:

def foo(): 
    A = 2 

在這兩種情況下,你創建一個局部變量的函數內。在一種情況下,它的值是一個類,另一種情況下它的值是一個整數,但在這兩種情況下,它都是局部變量,並且在函數外部不存在。

在第二個示例中,該類是在封閉類中創建的。在類名稱空間內創建的變量是類屬性,所以是的,您可以像描述的那樣訪問它。 (爲什麼你會想這樣做是另外一個問題。)換句話說,如上所述,這樣的:

class A(object): 
    class B(object): 
     pass 

是不是不同的:

class A(object): 
    B = 2 

在創建這兩種情況班級A具有班級屬性B.