2012-02-06 32 views
5

これを行う方法はありますか?私は私が直接__class__を呼び出すことはできません知っているクラス属性の継承(Python)

class Parent(): 
    class_attribute = "parent" 

    @staticmethod 
    def class_method(): 
     print __class__.class_attribute 

class Child(Parent): 
    class_attribute = "child" 

...私はPythonで動作しますが、任意のプログラミング言語でそれを行う方法があるかどうかはわかりません。クラスの属性に基づいて子クラスを別の方法で動作させたいので、クラスそのものへの参照のようなものが必要なので、その例です。その後、

となって出力は次のようにする必要があります:

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

私は同じ技術がインスタンスを通じて達成することができます知っています。しかし、私は__init__メソッド内のコードが長くて厳しいかもしれないので、私がclass_methodを頻繁に呼びたいと思うと、この1つのメソッド呼び出しのためだけに使用されるインスタンスをたくさん作成しなければならないので、インスタンスを作成したくありません。 class_attributeclass_methodは静的であり、インスタンスによって変更されないためです。

+0

あなたは単に静的な機能について話していますか? – Tigran

答えて

9

のErを、あなたは驚くことではないclassmethodデコレータで行われるクラスメソッド、したいように聞こえる:

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

ドキュメントを考慮すると、「クラスメソッドが派生クラスに対して呼び出された場合、**派生クラスオブジェクト**が暗黙の第1引数として渡されます」ということは、派生クラスオブジェクトが何らかの方法で作成されることを意味しますか? OPはそれがインスタンスコンストラクトを避けたいと言っているからです。 – Tigran

+0

メソッドのコードが実際に属性を印刷するだけでもっと複雑なことがあるかもしれないので、メソッドを呼びたいと思っていました。私はより簡単な例を作っても、私が望んでいたことを簡単に説明することができました。だから、@classmethodは解決策です。 – davekr

3

それはちょうどまたはインスタンスを作成せずに、Pythonで動作します。

>>> 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' 
>>> 
関連する問題