Dict как локальная переменная в классе - PullRequest
1 голос
/ 27 февраля 2020

У меня есть следующий код:

class PythagoreanProof(Scene):
    CONFIG={
    "color_triangulos":YELLOW,
    "color_rect_c":RED,
    "color_rect_b":ORANGE,
    "color_rect_a":ORANGE,
    "color_cuadrado_c":ORANGE,
    "opacidad_triangulos":0.6,
    "opacidad_cuadradro_a":0.6,
    "opacidad_cuadradro_b":0.6,
    "opacidad_cuadradro_c":0.6,
    "grosor_lineas":1,
    "l_a":5/5,
    "l_b":12/5,
    "l_c":13/5,
    }
    def construct(self):
        self.wait()
        self.pre_cuadrado()
        self.pos_cuadrado()
        self.tran_pre_pos_cuadrado()
        self.wait()

    def pre_cuadrado(self):
        cuadro=Square(side_length=self.l_a+self.l_b)

Как видите, я могу получить доступ к ключу "l_a" через self.l_a

Но в этом гораздо более простом коде я получаю следующая ошибка

class Example():
     CONFIG = {'spam':25}

     def __init__(self, value):
         self.data = value 

         def display(self):
             print(self.data, self.spam)  

x=Example(2)
x.display()

AttributeError: 'Example' object has no attribute 'spam'

Почему это работает в первом примере? Как это на самом деле работает?

Спасибо!

Ответы [ 2 ]

0 голосов
/ 27 февраля 2020

Я подозреваю, что в классе Scene есть маги c, играющие с методом __getattr__. Как это:

class Scene:
    # Minimalistic example.
    # See https://docs.python.org/3.8/reference/datamodel.html#object.__getattr__
    def __getattr__(self, name):
        return self.CONFIG[name]


class Example(Scene):
    CONFIG = {'spam': 25}

    def __init__(self, value):
        self.data = value

    def display(self):
        print(self.data, self.spam)


x = Example(2)
x.display()
# -> 2 25
0 голосов
/ 27 февраля 2020

Что касается того, почему это работает, когда Scene наследуется классу PythagoreanProof, вам нужно взглянуть на код Scene, чтобы увидеть, что он на самом деле делает.

В классе Example вы определили CONFIG как объект уровня класса. Ваш метод display должен указать на этот объект с помощью self.CONFIG, а затем использовать ключ 'spam', чтобы получить его значение '25'.

Чтобы сделать ключи в атрибутах CONFIG, вы можете использовать оболочку @poperty.

См. Пример ниже

class Example():
    CONFIG = {'spam': 25}

    def __init__(self, value):
        self.data = value

    def display(self):
        print(self.data, self.CONFIG['spam'])

    @property
    def spam(self):
        return self.CONFIG['spam']

x = Example(2)
x.display()
print(x.spam)
2 25
25

Обратите внимание на некоторых из вас Идентификаторы неверны. Метод display должен быть не функцией под __init__, а методом класса Example.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...