2012-08-13 118 views
4

是否有可能不發生重寫?例如:具有相同名稱的子類變量

class A: 
    def __init__(self, name): 
     self.name = name 

class B(A): 
    def __init__(self, name): 
     A.__init__(self, name) 
     self.name = name + "yes" 

是否有B類任何方式self.name從爲A類的是獨立的,或者是強制要求使用不同的名稱?

+0

我不確定你的問題是什麼。你在這裏有什麼是有效的代碼,除非你詢問B類的_instances_是否可以有兩個'self.name'值。這個問題的答案是否定的。 – 2012-08-13 00:52:36

+0

@ g.d.d.c這正是我所要求的;無論B類的實例是否可以擁有自己的名稱值,同時仍保留其超類的名稱。感謝您的確認! – idlackage 2012-08-13 00:57:02

+0

關於OP示例的新手問題:在B .__ init__中,他調用A .__ init__,而不是我期望的,self .__ init__。前者設置* class *變量名稱,正確的?然後,它應該是相同的,除非一個實例有__init __...的新定義? – 2012-09-07 17:51:20

回答

8

用兩個下劃線前綴名稱會導致名稱混亂,這似乎是你想要的。例如

class A: 
    def __init__(self, name): 
     self.__name = name 

    def print_name(self): 
     print self.__name 


class B(A): 
    def __init__(self, name): 
     A.__init__(self, name) 
     self.__name = name + "yes" 

    def print_name(self): 
     print self.__name 

    def print_super_name(self): 
     print self._A__name #class name mangled into attribute 

在類定義中,就可以正常處理__name(如在print_name方法)。在子類和類定義之外的其他任何地方,類的名稱會被改寫成具有前面下劃線的屬性名稱。

b = B('so') 
b._A__name = 'something' 
b._B__name = 'something else' 
在您發佈,子類屬性將覆蓋超類的 name,這往往是你想要什麼樣的代碼

。如果你想讓它們分開,但是使用相同的變量名,請使用下劃線

相關問題