2012-08-13 4 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" 

는 클래스 A의과는 독립적이어야하는 클래스 B의 self.name 수있는 방법이 있습니까, 아니면 다른 이름을 사용하는 것이 필수입니다?

+0

귀하의 질문이 확실하지 않습니다. 클래스 B의 _ 인스턴스 _가'self.name'에 대해 두 개의 값을 가질 수 있는지 묻지 않는 한, 여기에있는 것은 유효한 코드입니다. 그 질문에 대한 대답은 '아니오'입니다. –

+0

@ g.d.d.c 그게 정확히 내가 원하는거야. 클래스 B의 인스턴스가 슈퍼 클래스의 이름을 유지하면서 고유 한 이름 값을 가질 수 있는지 여부 확인 감사합니다! – idlackage

+0

OP의 예에 대한 초보자 질문 : B .__ init__에서 그는 예상했던 것 대신 A .__ init__을 호출합니다. self .__ init__. 전자는 * class * 변수 이름을 설정합니다. 맞습니까? 인스턴스가 __init __ ...의 새로운 정의를 가지고 있지 않으면 다시 동일해야합니다. –

답변

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 

들어 있습니다 (print_name 방법에서와 같이) 일반적으로 __name를 해결할 수 있습니다. 하위 클래스 및 클래스 정의 외부의 다른 곳에서는 클래스 이름이 앞에 밑줄이있는 속성 이름으로 변환됩니다. 당신은, 서브 클래스의 속성이 슈퍼 클래스의 name, 당신이 원하는 것 무엇을 종종있는 우선합니다 게시 된 코드에서

b = B('so') 
b._A__name = 'something' 
b._B__name = 'something else' 

. 변수 이름이 동일하지만 변수 이름이 같아 지도록하려면 밑줄을 사용하십시오.

관련 문제