Когда вы используете декоратор @value.setter в своем методе def value(self, new_value)
, вы говорите Python использовать этот метод в качестве метода установки, что означает его вызов при каждом вызове self.value = something
.
Таким образом, конструктор BlackJackCard
вызывает конструктор Card
, который говорит self.value = x
, который вызывает value(self, x)
, который, в свою очередь, выполняет self._value = x
.Таким образом, ваша карта имеет атрибуты value
и _value
, установленные на x
.
Пример с @ decorators:
class A(metaclass=ABCMeta):
def __init__(self, value):
print('constructing A')
self.x = value
class B(A):
def __init__(self, value):
print('constructing B')
super().__init__(value)
@property
def x(self):
print('getting x')
return self._internalX
@x.setter
def x(self, new_x):
print('setting x')
self._internalX = new_x
# test B
b = B('X')
print('b.x = "{}"'.format(b.x))
print('b._internalX = "{}"'.format(b._internalX))
Вывод:
constructing B
constructing A
setting x
getting x
b.x = "X"
b._internalX = "X"
Контр-пример БЕЗ @ декораторов:
class A(metaclass=ABCMeta):
def __init__(self, value):
print('constructing A')
self.x = value
class C(A):
def __init__(self, value):
print('constructing C')
super().__init__(value)
def x(self):
print('not getting x')
return self._internalX
def x(self, new_x):
print('not setting x')
self._internalX = new_x
# test C
c = C('X')
print('c.x = "{}"'.format(c.x))
try:
print('c._internalX = "{}"'.format(c._internalX))
except AttributeError as e:
print('oops:',e)
Вывод:
constructing C
constructing A
c.x = "X"
oops: 'C' object has no attribute '_internalX'