2010-04-28 7 views
8

특정 기본 클래스에서 파생 된 모든 클래스는 "path"라는 속성을 정의해야합니다. 오리 타이핑의 의미에서 나는 서브 클래스에서 정의에 의존 수 :매개 변수를 기본 클래스 생성자에 전달하거나 인스턴스 변수를 사용합니까?

class Base: 
    pass # no "path" variable here 

def Sub(Base): 
    def __init__(self): 
     self.path = "something/" 

또 다른 possiblity가 기본 클래스 생성자를 사용하는 것입니다 :

class Base: 
    def __init__(self, path): 
     self.path = path 

def Sub(Base): 
    def __init__(self): 
     super().__init__("something/") 

내가 파이썬 3.1 사용합니다.

무엇을 원하십니까? 이유가 무엇입니까? 더 좋은 방법이 있습니까? 파이썬 3.0 이상에서

답변

11

: 두 번째 예에서이 같은
내가 기본 클래스의 생성자에 매개 변수와 함께 갈 것입니다. 이 클래스는 필요한 경로 속성을 제공하기 위해 Base에서 파생 된 클래스를 강제로 생성하므로 클래스에 이러한 속성이 있고 파생 클래스가 제공해야한다는 사실을 문서화합니다. 이것이 없다면 클래스의 문서 문자열 어딘가에 명시되어있는 (그리고 읽혀진) 것에 의존 할 수있다. 물론 특정 속성이 무엇인지 문서화에 명시하는 것은 도움이된다.

파이썬 2.6 이상 :
나는 위의 어느 것도 사용하지 않을 것이다; 이 같은 모든 종류의// 사용이 특정 매개 변수를해야한다는 사실을 문서화하기 때문에 즉

class Base(object): 
    def __init__(self,path): 
     self.path=path; 

class Sub(Base): 
    def __init__(self): 
     Base.__init__(self,"something/") 

, 나는, 기본 클래스의 생성자에서 이러한 매개 변수를 필요로하고, 매개 변수는 그 대신 내가 사용하는 것이 provieded해야합니다. 그러나 나는 super()를 super is somewhat fragile and dangerous in Python으로 사용하지 않을 것이고 객체 (또는 다른 새로운 스타일) 클래스로부터 상속 받음으로써베이스를 new-style class으로 만들 것입니다.

+5

'super()'에 대해 아무 것도 상처가 없습니다. 취약성은 3.x (OP가 사용하고있는'super()'호출과 같이 고정되어있는 2.x 문법과 일반적으로 다중 상속이다. 파이썬 3.x에서 baseclass 메소드를 직접 호출하는 이유가 없기 때문에 'super() .__ init (...)'구문은 더 나쁘지 않고 종종 우수합니다. –

+0

'super'를 사용하여 판단하면 deamon이 py3k를 사용하고 있다고 생각합니다 – SilentGhost

+0

@Thomas Wouters : 다른 생성자 서명을 가진 다중 상속과 기본 클래스가 있다면 super를 어떻게 사용 하시겠습니까? 파생 클래스의 모든 인수를 모든 기본 클래스에 전달하는 것은 더러운 해킹처럼 보이며 명명 된 매개 변수에 의존하고 기본 클래스가 필요로하는 것을 정리하도록합니다. – kriss

관련 문제