【问题标题】:Automatically transform all variables in a class to "self" variables自动将类中的所有变量转换为“自我”变量
【发布时间】:2020-07-12 09:12:58
【问题描述】:

我的代码(最小示例)如下所示:

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

我正在寻找像set_all_vars_to_self_vars() 这样的函数,我可以在Hello 类中调用它,这样Hello 类就相当于:

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))

【问题讨论】:

  • 使用 IDE。 Pycharm 应该可以做到。
  • 当你只有像 1,2,3,4 这样的数字时,你不需要任何不同于你的第一个 sn-p 的东西。
  • 我的例子是一个更复杂情况的最小例子。我不希望我的代码看起来像示例 2,而只是表现得像它。原因:大约有 300 行我使用 a,b,c 并且我不想每次都使用 self. 出于可读性原因
  • 也许您可以更改您的最小示例以包含更实际的变量类型。目前你不需要像第二个 sn-p 这样的代码。
  • 我不明白您的“丰富示例”中的代码与您的问题有何关联。您想在代码中更改什么?

标签: python class self manim


【解决方案1】:

您在__init__ 之外定义的变量与您在__init__ 中声明的变量根本无法比较。第一个属于Class,第二个属于Object

因此,如果您希望 abcdHello() 的每个实例而更改,则不应在 __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 的每个变量的副本。

这是你想要的吗?

【讨论】:

    猜你喜欢
    • 2018-03-21
    • 1970-01-01
    • 1970-01-01
    • 2016-01-01
    • 2022-01-24
    • 2021-01-01
    • 2019-11-11
    • 2012-07-09
    • 2020-04-27
    相关资源
    最近更新 更多