2016-08-24 9 views
0

は、どのように、クラスのレベルでクラスのメンバ関数をクラスレベルまたはインスタンスオブジェクトのレベルで定義するにはどうすればよいですか?クラスを定義するときに、最初の引数がクラスのインスタンスオブジェクトクラスオブジェクトではなく、すなわちPythonの2.7で

  • メンバ関数を定義することができ

  • メンバはクラスのインスタンスオブジェクトのレベルで機能します。つまり、最初の引数はクラスオブジェクトではなくクラスのインスタンスオブジェクトです。

特定のクラスを使用する場合、メンバー関数がクラスのレベルにあるのかクラスのインスタンスオブジェクトのレベルにあるのかをどのようにして知ることができますか? クラスレベル器具をTestSuiteに実装されている間

は、例えば、Pythonの標準ライブラリに、TestCaseからsetUp()は、インスタンス・オブジェクトのレベルでTestCase、すなわち各インスタンスオブジェクトに対して呼び出されます。テストスイートに新しいクラスからのテストが行​​われると、前のクラス(存在する場合)からtearDownClass()が呼び出され、setUpClass()から新しいクラス が呼び出されます。

ありがとうございました。

+1

あなたは@classmethodを探していますか? – galaxyan

+0

ありがとうございます。多分。 '@ classmethod'はPython公式サイトのいくつかの文書で、クラスとインスタンスオブジェクトについて一般的に議論していますか?私はPython Language ReferenceとPython Tutorialで '@ classmethod'を見つけられません。 – Tim

+0

https://docs.python.org/3/library/functions.html#classmethodこれらは、このセクションの最後の段落(https://docs.python.org/3/reference/datamodel.html#the-standard-type-hierarchy)にも記載されています。 ...そのリンクの ''インスタンスメソッド ''の見出しもチェックしてください。 – wwii

答えて

2

@classmethodフォームは関数デコレータです。詳細については関数定義の 関数定義の説明を参照してください。

クラス(C.f()など)またはインスタンス (C()。f()など)で呼び出すことができます。インスタンスはそのクラスを除いて無視されます。派生クラスに対して クラスメソッドが呼び出された場合、派生クラスオブジェクト が暗黙の第1引数として渡されます。

クラスメソッドは、C++またはJavaの静的メソッドとは異なります。 が必要な場合は、このセクションのstaticmethod()を参照してください。

クラスメソッドの詳細については、標準タイプ階層の標準タイプ階層 のドキュメントを参照してください。

https://docs.python.org/2/library/functions.html#classmethod

class A: 
... message = "class message" 
... 
... @classmethod 
... def classLevel(cls): 
...  print(cls.message) 
... 
... def instanceLevel(self, msg): 
...  self.message = msg 
...  print(self.message) 
>>> a= A() 
>>> a.instanceLevel('123') 
123 
>>> A.classLevel() 
class message 
>>> a.classLevel() 
class message 
>>> A.instanceLevel() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: unbound method instanceLevel() must be called with A instance as first argument (got nothing instead) 


    A.__dict__ 
{'classLevel': <classmethod object at 0x4E974BB0>, '__module__': '__main__', 'instanceLevel': <function instanceLevel at 0x550C8530>, 'message': 'class message', '__doc__': None} 
関連する問題