2012-07-22 128 views
-1

我一直在尋找答案,但沒有運氣。我需要有一個子類訪問其父類中屬性的值。如何從Python中的私有類繼承父類屬性?

下面是一個例子:

class myclass: 
    def __init__(self): 

     class __firstinternal__: 
      def __init__(self): 
       self.second = __secondinternal__() 

     class __secondinternal__: 
      def __init__(self): 
       self.var = myclass.getString() 

    def getString(self): 
     return "something" 

    self.internal = __firstinternal__() 
    print self.internal.second.var 

c = myclass() 
Traceback (most recent call last): 
    File "./inheritest.py", line 19, in <module> 
    c = myclass() 
    File "./inheritest.py", line 15, in __init__ 
    self.internal = __firstinternal__() 
    File "./inheritest.py", line 7, in __init__ 
    self.second = __secondinternal__() 
    File "./inheritest.py", line 11, in __init__ 
    self.anothervar = myclass.getString() 
AttributeError: class myclass has no attribute 'getString' 

換句話說,我需要secondinternal繼承方法的getString()從父MyClass的。

我發現如何做到這一點,當類不是一個孩子,但我想保持這兩個類是私人的。

任何想法?

在此先感謝!

+3

您的代碼沒有意義。在'__init__'方法中定義這些類將不會執行任何操作;當方法結束執行時,它們會消失。你有可能在你的代碼中搞砸縮進嗎?你是否試圖將類設置爲外部類的屬性?另外,你爲什麼使用雙下劃線? – BrenBarn 2012-07-22 19:27:52

+1

XY。描述你試圖解決的問題,而不是想象中的愚蠢解決方案。 – 2012-07-22 19:30:21

+0

只要子類使用自己的方法,代碼就可以完美地工作。我的問題是隻有當我需要使用父類的方法。關於雙下劃線 - 嗯,我認爲這是一個孩子班級應該如何定義的... – user1544357 2012-07-22 19:32:20

回答

2

目前尚不清楚「孩子班」和「家長班」的含義。在另一個類中定義一個類並不是一種常見的Python模式。你需要更多地解釋你如何使用這些術語。此外,您發佈的代碼不會給出您描述的錯誤,所以看起來您發佈的代碼不同於您正在運行的代碼。

根據你的代碼,我可以給出的最佳答案是「你不能做你想做的事情。」如果在的__init__方法中定義了__firstinternal__,則它沒有提及myclass,所以它無法訪問它或其任何方法。 myclass只有在定義了所有方法後才存在,因此方法內部沒有任何東西可以在類定義時訪問類定義的其他部分。你可以在運行時通過myclass.getString()來訪問它,你認爲它不起作用,但如前所述,這是沒有意義的,因爲你給出的錯誤不是代碼實際做的。

這可能是你應該使用繼承而不是相互定義類,但這只是一個瘋狂的猜測。

您應該閱讀Python tutorial以瞭解如何在Python中使用類。

+0

感謝大家的及時回覆。 – user1544357 2012-07-22 19:40:10

1

您的代碼很混亂。盡我所知,這裏有兩種不同的方式來做類似你想要的事情。

class myclass: 
    def __init__(self): 
     pass 

    def getString(self): 
     return "something" 

class child(myclass): 
    def __init__(self): 
     self.var = self.getString() 

    def someMethod(self): 
     return "hello" 

...它的輸出:

>>> c = child() 
>>> print c.var 
something 

在這裏,我定義了一個父類myclasschild繼承myclass。它可以像正常一樣調用getString,因爲它繼承了它。

如果你需要保持你的類私人(這是不是在Python中常見的成語),這裏是做到這一點的一種方法:

class myclass2: 
    def __init__(self): 
     class temp(myclass2): # inherits myclass 
      def __init__(self): 
       self.var = self.getString() 

     self.__privateClass = temp 

    def getString(self): 
     return "something else" 

    def test(self): 
     temp = self.__privateClass() 
     print temp.var 

和輸出:

>>> m = myclass2() 
>>> m.test() 

。儘管這種方法有點愚蠢。

另請注意,雙下劃線用於將某些內容標記爲私有,而不是孩子類。(另請注意,「私有變量」的概念在python中與其他語言不同。)More info