2017-08-25 139 views
0

我已經學習了以JAVA爲第一語言的OOP原則,然後我已經轉移到Python,所以這個特殊的功能對我來說看起來有點奇怪,雖然在很多情況下很有用。在父類中訪問子類屬性是一個好主意

但是,我想知道它是否真的可取。

以下將在JAVA中給出錯誤,因爲您不能在父類中訪問子類的屬性。

class parent(object): 
    def print_x(self): 
     print self.x 


class child(parent): 
    x = 10 

child().print_x() 

PEP8也給在這種情況下,一個警告:

未解決的屬性引用 'X' 類 '父'

代碼遍歷和調試變得有點問題我個人想法。

+5

既然你可以* *'實例上parent'其自身,這將產生一個錯誤,*是*,這是有問題的。 Python比Java更具動態性,並且在編譯時不檢查它。與Java中的原因一樣,它仍然是不好的代碼。 – deceze

回答

3

也許這是一個地方,依賴注入會更合適(組成與繼承)。一個「父母」深入到它的「孩子」充其量是可疑的。

怎麼樣的線沿線的東西更多:

class Container(object): 
    def __init__(self, child_instance): 
     self.child = child_instance 

    def print_x(self): 
     print self.child.x 

class Child(object): 
    def __init__(self, x): 
     self.x = x 

child = Child(10) 
parent = Container(child) 
parent.print_x() 

有許多優點,以代替繼承的成分在許多情況下,像這樣的,我強烈建議你研究他們。

+1

你的意思是'打印self.child.x'吧? –

+0

@GaurangShah絕對,thx! – smassey

1

更清潔的方法是

class Parent(object): 

    @property 
    def x(self): 
     raise NotImplementedError 

    def print_x(self): 
     print self.x 


class Child(Parent): 
    x = 10