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

(我已经编辑了我以前的 anwser,它正在工作,但正如所指出的,这并不是一个很好的做法)

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。换句话说,您创建一个临时对象,然后调用 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
于 2012-11-17T12:11:59.833 回答