0

ここで何が起きてるの?

角かっこはここで何をしますtest2 = A()か?

オブジェクトA()を呼び出し可能にするにはどうすればよいですか。

class A(object):
    @property
    def a(self):
        "an important attribute"
        return ["a value","dsfsdfsd"]

test1 = A

test2 = A()


print test1().a                                

print test2().a      
4

1 に答える 1

0

(以前の回答を編集しましたが、これは機能していましたが、指摘されているように、実際には良い習慣ではありません)

ここで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
于 2012-11-17T12:11:59.833 に答える