Python支持類屬性,實例屬性和屬性。什麼是初始化屬性或屬性的Pythonic方法?
from time import ctime, sleep
class MyClass(object):
A = ctime() # class attribute
def __init__(self):
self.B = ctime() # instance attribute
self._C = None
@property
def C(self): # property
if self._C is None:
self._C = ctime()
return self._C
@C.setter
def C(self, c):
self._C
爲了誰不知道一個用戶,MyClass的是如何實現的,A,B和C表現出類似的行爲:
sleep(2)
myObject = MyClass()
sleep(2)
print myObject.A # prints time module was initialized
print myObject.B # prints time instance was created, 2 sec later
print myObject.C # prints time this line was called, 2 sec later
myObject.A = 'foo' # myObject.A is now an instance attribute
myObject.B = 'foo' # myObject.B is still an instance attribute
myObject.C = 'foo' # myObject.C is still an (instance) property
print myObject.A # prints 'foo'
print myObject.B # prints 'foo'
print myObject.C # prints 'foo'
從我來到這裏的答案,我明白了以下幾點:第一次打印myObject.A
,myObject.A
是myObject.__Class__.A
是MyClass.A
。第二次myObject.A
不是myObject.__Class__.A
。精細。
在上面的示例中,ctime()
僅用於說明A,B和C如何區別。現在假設,我們使用的是不變的常數代替:
class MyClass(object):
A = 'bar' # class attribute
def __init__(self):
self.B = 'meta' # instance attribute
self._C = None
@property
def C(self): # property
if self._C is None:
self._C = 'foobar'
return self._C
@C.setter
def C(self, c):
self._C = c
myObject = MyClass()
myObject.A
仍是類屬性MyClass.A
,而myObject.B
是一個實例屬性和myObject.C
是一個屬性。他們所有人都按照我的意願去做。他們有一個默認值,我可以分配一些其他值。我應該使用哪種款式,A,B或C?
其實他們都不是「工作」。他們不是都做同樣的事情。 'foo.A'實際上**創建**一個實例變量,它在現有的'Foo.A'類變量之前被找到。 「我應該使用哪種風格」完全取決於你的目標是什麼。你想要實例變量還是類變量?請在問題中包含您的目標。 – 2012-02-08 22:05:44