Я бы немного переосмыслил то, что вы пытаетесь сделать - возможно, даже посмотрите исходный код BeautifulSoup, чтобы увидеть, как они это делают.
В общем, нет никаких причин (о которых я могу думать) для динамического определения атрибутов экземпляра, подобных этому. У вас должен быть leg
словарь или список в ваших Dog
объектах, например:
def __init__(self, legs_colors: dict):
self.legs_colors = legs_colors.copy()
Атрибуты экземпляра должны быть важны индивидуально, но я сомневаюсь, что вы планируете использовать leg_1
иначе, чем вы планируете использовать leg_72
, тем более что вы не можете гарантировать, что любой из этих атрибутов будет существовать так, как вы определено __init__
.
Кроме того, когда вы позже получите доступ к этим атрибутам ног, вы, вероятно, захотите сделать это динамически. В этом случае вам придется прибегнуть к чему-то вроде:
for leg in [f'leg_{i}' for i in range(100)]
color = getattr(doge, leg)
# do something with leg and color
вместо более простого, ясного и менее вонючего:
for leg, color in doge.legs_colors.items():
# do something with leg and color
Вы по-прежнему можете программировать различные интерфейсы для доступа к своему словарю leg_colors, если хотите. Например, вы можете перезаписать __getitem__
в своем классе Dog, если хотите иметь возможность делать doge[i]
напрямую.