Разовое решение:
Измените __init__
для прямого доступа к словарю класса:
def __init__(self, pins, groups):
max_pin = self.__class__.__dict__.get('max_pin', 0)
self.__class__.max_pin = max(max_pin, pins//groups)
Интересно, что вы могли бы легко иметь каждый элемент LEDсохраните свои собственные max_pin
, добавив эту строку в конце __init__
:
self.max_pin = pins//groups
так:
>>> IgelTyp.max_pin
24
но:
>>> IgelType.LED_2.max_pin
12
Решение для повторного использования
Создайте собственный дескриптор атрибута класса и используйте его, чтобы оградить max_pin
от превращения в член IgelTyp
:
class ClassVar: # add (object) if using Python 2
"a class variable"
def __init__(self, value):
# store initial value
self.value = value
def __get__(self, *args):
# get value in ClassVar instance (only doable because all instances
# share same value)
return self.value
def __set__(self, _, value):
# save value in ClassVar instance (only doable because all instances
# share same value)
self.value = value
Дескрипторы, такие как property
, обычно хранят значение в самом экземпляре, чтобы каждый экземпляр мог иметь свое собственное значение (например, 24, 12 и 4 из вашего примера);однако, поскольку вы хотите знать максимальное количество выводов во всех экземплярах, мы просто сохраняем это единственное значение в экземпляре ClassVar
.
Изменения в IgelTyp
:
class IgelTyp(Enum):
LED_1 = (24, 1)
LED_2 = (24, 2)
LED_3 = (16, 4)
max_pin = ClassVar(0)
def __init__(self, pins, groups):
self.max_pin = max(self.max_pin, pins//groups)
и используется:
>>> IgelTyp.max_pin
24
>>> IgelTyp.LED_2.max_pin
24