这里发生了什么?
这里的括号有什么用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
答案 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