Python支持类属性、实例属性和属性。
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
类变量之前找到。 “我应该使用哪种风格”完全取决于您的目标是什么。您想要实例变量还是类变量?请在问题中包含您的目标。 - S.Lott