TypeError:'A'对象不可调用

时间:2012-11-17 12:06:49

标签: python

这里发生了什么?

这里的括号有什么用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      

1 个答案:

答案 0 :(得分: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。换句话说,您创建一个临时对象,然后调用该属性。它适用于您的示例,但它并不比静态方法更有用,因为该对象是临时的(通常使用类方法来查看/修改对象的内部状态)。

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