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
.Fine.
В приведенном выше примере 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?