(以前の回答を編集しましたが、これは機能していましたが、指摘されているように、実際には良い習慣ではありません)
ここでPythonのオブジェクト表現の間にはわずかな混乱があります:
test1 = A
print test1 #return : <class '__main__.A'>
Pythonでは、クラスはPythonのオブジェクトでもあるため、クラスをコピーできます。エイリアスとして見ることができますが、それよりも便利です。
test2 = A()
print test2 #return : <__main__.A object at 0x0126DF90>
ここでは、特定の住所にAオブジェクトを作成しました。
print test1().a
あなたがしていることは実際には:A().a
。つまり、一時オブジェクトを作成してから、プロパティを呼び出します。これはあなたの例では機能しますが、オブジェクトは一時的であるため、静的メソッドよりも便利ではありません(通常、クラスメソッドtakeは、オブジェクトの内部状態を表示/変更するために使用されます)。
print test2().a # == [A()]().a
オブジェクトをメソッドとして呼び出したいため、これは機能しません。これを行う__call__
には、クラスの説明に特別なメソッドを追加する必要があります。あなたの財産が重要であるならば、それは私がすることです:
class State(object):
" Dummy Finite state machine "
def __init__(self)
self.count = 0
@property
def state(self):
return self.count % 4
def __call__(self):
return self.state
def next(self):
self.count +=1
s = State() # State object
print s() # return 0
s.next() # count = 1
s.next() # count = 2
s.next() # count = 3
s.next() # count = 4
s.next() # count = 5
print s() # return 5 % 4 =1