2012-02-06 6 views
5

이렇게 할 수있는 방법이 있습니까? 클래스 속성 상속 (파이썬)

class Parent(): 
    class_attribute = "parent" 

    @staticmethod 
    def class_method(): 
     print __class__.class_attribute 

class Child(Parent): 
    class_attribute = "child" 

는 내가 직접 __class__를 호출 할 수 없습니다 알고 ... 파이썬에서 작동하지만 나는 어떤 프로그래밍 언어로 그것을 할 수있는 방법이 있는지 모르겠습니다. 그 클래스의 속성에 따라 다르게 행동하게하고 싶기 때문에 클래스 자체에 대한 참조와 같은 것을 원할 것이기 때문에 그 예일뿐입니다. 이 같은

그리고 가정 출력해야한다 :

> Parent.class_method() 
"parent" 
> Child.class_method() 
"child" 

나는 같은 기술은 인스턴스를 통해 수행 할 수 있습니다 알고 있습니다. 하지만 때로는 __init__ 메서드 내의 코드가 길어서 까다로울 수 있으므로 class_method을 자주 호출하려고하기 때문에이 메서드 호출을 위해 사용 된 인스턴스를 많이 만들어야하기 때문에 인스턴스를 만들고 싶지 않습니다. class_attributeclass_method은 정적이므로 인스턴스별로 변경되지 않습니다.

+0

당신은 단순히'정적'함수에 대해 이야기하고 있습니까? – Tigran

답변

9

소리 :

class Parent(object): 
    class_attribute = "parent" 

    @classmethod 
    def class_method(cls): 
     print cls.class_attribute 

class Child(Parent): 
    class_attribute = "child" 


>>> Parent.class_method() 
parent 
>>> Child.class_method() 
child 

또는 bgporter가 지적했듯이, 메소드를 전혀 필요로하지 않고 속성을 사용하여 직접 수행 할 수 있습니다.

+0

예, 이것이 제가 원했던 바로 그 것입니다, 대단히 감사합니다! – davekr

+0

하지만 문서를 고려하면 : "파생 클래스에 대해 클래스 메서드가 호출되면 ** 파생 클래스 객체 **가 암시 된 첫 번째 인수로 전달됩니다."라는 말은 파생 클래스 객체가 어떤 방식 으로든 생성된다는 의미입니까? OP가 인스턴스 생성을 피하기를 원하기 때문에. – Tigran

+0

메서드의 코드가 실제보다 복잡한 다음 실제로 복잡한 작업을 수행 할 수 있기 때문에이 메서드를 호출하고 싶습니다. 나는 더 쉬운 예제를 만들면 내가 원했던 것을 쉽게 설명 할 수있다. 그래서 @classmethod는 해결책이다. – davekr

3

그것은 단지 또는 인스턴스 작성하지 않고, 파이썬에서 작동 : 당신은 놀랍게도 classmethod 장식으로 수행하지 않는 classmethod을 원하는 것처럼, 어

>>> class Parent(object): 
... attribute = "parent" 
... 
>>> class Child(Parent): 
... attribute = "child" 
... 
>>> p = Parent() 
>>> p.attribute 
'parent' 
>>> c = Child() 
>>> c.attribute 
'child' 
>>> Parent.attribute 
'parent' 
>>> Child.attribute 
'child' 
>>>