Автоматически преобразовывать все переменные в классе в «собственные» переменные - PullRequest
0 голосов
/ 12 июля 2020

Мой код (минимальный пример) выглядит так:

class Hello:
    a=1
    b=2
    c=3
    def __init__(self):
        self.d= 4

, и я ищу функцию типа set_all_vars_to_self_vars(), которую я могу вызвать в классе Hello, чтобы Hello class становится равнозначным:

class Hello:
    def __init__(self):
        self.d = 4
        self.a = 1
        self.b = 2
        self.c = 3

Есть ли какая-то функция, которая это делает?

Богатый пример выглядит так:

from manim import *

class Scene1(Scene):
    def construct(self):
        dot = Dot()
        circ= Circle()
        self.add(dot,circ)
        self.set_variables_as_attrs(dot)  # at the moment, variables have to be added manually
        return self

class Scene2(Scene):
    def construct(self):
        sc1 = Scene1.construct(self)
        dot2= Dot().next_to(sc1.dot)
        self.play(ShowCreation(dot2))

1 Ответ

1 голос
/ 12 июля 2020

Переменные, которые вы определяете вне __init__, совершенно не сопоставимы с теми, которые вы объявляете внутри __init__. Первые принадлежат Class, вторые принадлежат Object.

Таким образом, если вы хотите, чтобы a, b, c и d изменялись с каждым экземпляр Hello(), вы не должны объявлять их вне области __init__(). Они просто не имеют того же значения.

Однако, если это то, что вы хотите сделать, вот как это сделать:

class Hello:
    a = 4
    b = 4
    c = 4

    def __init__(self):
        d = 4
        for attr in dir(self):
            if not callable(attr) and not attr.startwith('__'):
                self.__dict__.setdefault(attr, Hello.__dict__.get(attr))

Затем с помощью H = Hello() вы будете иметь, например, H.a = Hello.a. В более общем смысле, у вас будет копия каждой переменной из Class для каждого Instance вашего Class.

Вы этого хотите?

...