2012-08-13 108 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,这往往是你想要什么样的代码

。如果你想让它们分开,但是使用相同的变量名,请使用下划线

相关问题