2011-08-09 4 views
2

저는 C++과 Java를 알고 있고 Pythonic 프로그래밍에 익숙하지 않습니다. 어쩌면 나쁜 스타일 일 수도 있습니다. 내가 클래스의 인스턴스를 만들려고 노력하고 있지 않다 나의 작업에 대한 필요가 없기 때문에 내가 self 매개 변수를 사용하지 않는 오전,파이썬에서 오버라이드 된 클래스 함수를 참조하는 방법

class foo: 
     def a(): 
       __class__.b() # gives: this is foo 
       bar.b() # gives: this is bar 
       foo.b() # gives: this is foo 
       # b() I'd like to get "this is bar" automatically 

     def b(): 
       print("this is foo") 

class bar(foo): 
     def b(): 
       print("this is bar") 

bar.a() 

주의 사항 :

는 fallowing 예를 생각해 보자. 함수를 재정의 할 수있는 방법으로 함수를 참조하려고합니다.

답변

5

원하는 것은 a이 classmethod입니다.

class Foo(object): 
    @classmethod 
    def a(cls): 
     Foo.b() # gives: this is foo 
     Bar.b() # gives: this is bar 
     cls.b() # gives: this is bar 
    @staticmethod 
    def b(): 
     print("this is foo") 

class Bar(Foo): 
    @staticmethod 
    def b(): 
     print("this is bar") 

Bar.a() 

귀하의 스타일을 Python coding style과 일치하도록 수정했습니다. 들여 쓰기로 4 칸을 사용하십시오. 괄호 사이에 여분의 공백을 넣지 마십시오. 자본화 & CamelCase 클래스 이름.

staticmethod은 인수를 취하지 않고 클래스의 속성에 영향을주지 않는 클래스의 메소드입니다. classmethod은 클래스를 자동으로 특성으로 가져 오는 클래스의 메서드입니다.

귀하의 상속 사용은 괜찮 았습니다. 발

+0

고마워요! 당신의 대답에는 내가 묻지 않은 정보가있었습니다. 이제 나는 알고있다. [이 질문] (http://stackoverflow.com/questions/136097/what-is-the-difference-between-staticmethod-and-classmethod-in-python) 또한이 데코레이터에 대한 유용한 정보를 제공한다. – Johu

+0

문서의 기본 제공 기능 페이지에서도 관련 정보를 읽으시기 바랍니다. http://docs.python.org/library/functions.html#classmethod – agf

0

견적 Execution Model :

클래스 블록에 정의 된 이름의 범위는 클래스 블록으로 제한된다; 메소드의 코드 블록으로 확장되지 않습니다. 은 함수 범위를 사용하여 구현되므로 생성자 표현식을 포함합니다.

이것은 a 기능의 범위에 이름이 b임을 의미합니다. 클래스 나 인스턴스 객체를 통해 참조해야합니다.

+0

그는 어떻게 그렇게하는지 몰랐습니다. 그것이 그의 질문이었습니다. – agf

+0

@agf 나는 그가 왜 일어나고 있는지 알고 싶다고 생각합니다. –