2016-07-06 67 views
-3
class frozen(object) : 
    isFrozen = False 
    print 'In base' 

class layer(frozen): 
    print isFrozen 

我想了解在Python中的繼承概念,上面的行是一個愚蠢的例子。在我嘗試創建圖層類的對象時,父類中的「print」語句正在工作。但是它在子類的「print」語句中拋出一個錯誤。說「isFrozen」沒有定義。但是,如果我在子類中註釋掉「print」語句,我可以創建子類的對象並將「isFrozen」作爲「layerObject.isFrozen」來訪問。什麼時候可以在Python中使用父類變量?

那麼,有誰能指出我在這裏的誤解嗎?

+3

你讀過[Python教程](https://docs.python.org/3/tutorial/classes.html#class-and-instance-variables)嗎? – BrenBarn

+0

我遇到過這個特殊的教程。但是,這並不能幫助我理解上述情況中的錯誤原因。 「isFrozen」被定義爲一個類變量。但是爲什麼我不能從孩子課上訪問它? –

+0

@MazharulIslam,因爲你沒有在課堂上訪問它,你將它視爲一個全局的東西。只有在當前班級定義中定義的名字,而不是其父母的名字,沒有資格可用。 – jonrsharpe

回答

0

類體提供了一個命名空間和類(與函數不同)在模塊被讀取時(進口時間)被解析。你的問題是你正在調用frozen類的isFrozen而沒有命名空間。還充分利用繼承的你需要一個實際的類實例,它通常被簡稱爲self

class Frozen(object): 
    isFrozen = False 
    def __init__(self): 
     print Frozen.isFrozen 
     print "From Base" 


class Layer(Frozen): 

    def __init__(self): 
     print self.isFrozen ##this is defined by the parent 
     print "From subclass" 
     self.isFrozen = True 
     print self.isFrozen 


In [7]: test_class = Layer() 
False 
From subclass 
True 

In [8]: test_class.isFrozen 
Out[8]: True 

而一個RTFM在這裏建議爲好。

+1

在Python源代碼被編譯爲Python字節碼之前,它們被解析得更早。類的類體是**被執行**,但是,當'class'語句本身被執行時。 –

+1

Nitpicking,但是在它可以執行之前,整個模塊源被*解析*。 [函數定義](https://docs.python.org/3/reference/compound_stmts.html#function-definitions)在模塊加載期間執行,例如導致臭名昭着的「爲什麼我的默認列表參數保留在調用之間」。函數定義不會執行正文,我猜是你的意思。 –

+0

@IljaEverilä是的,這就是我的意思。好的標註雖然。 – salparadise

相關問題