Python实例变量

Python实例变量,python,variables,constructor,instance,Python,Variables,Constructor,Instance,在声明类实例变量时,是否可以使用对类的一个方法的调用来初始化构造函数中的一个实例变量?例如,假设我有一个Button类,该类methodA()中的一个方法将一个名为“active”的变量设置为False。我可以通过调用该方法来初始化“active”吗 class Button: def __init__(self): *snip* self.methodA() def methodA(self): self.active = Fa

在声明类实例变量时,是否可以使用对类的一个方法的调用来初始化构造函数中的一个实例变量?例如,假设我有一个Button类,该类methodA()中的一个方法将一个名为“active”的变量设置为False。我可以通过调用该方法来初始化“active”吗

class Button:
    def __init__(self):
        *snip*
        self.methodA()

    def methodA(self):
        self.active = False

这种技术在初始化实例变量“active”时正确吗?

是的,可以这样做。事实上,在Python中,任何非静态方法都可以为类的对象初始化新的数据成员。但是,建议始终在
\uuuu init\uuuu()
中初始化成员,因为在对象创建和初始化时初始化要使用的成员被认为是一种良好的做法。

在注释中添加了上下文,您的问题就更有意义了。是的,您可以在另一个方法中设置对象的任何属性。实际上,由于Python的动态类型,您甚至可以在对象初始化之后设置它们:

class Example:
    pass

e = Example()
e.foo = 'bar'
e.foo  # returns 'bar'
但是,一般来说,您希望在对象的
\uuuuu init\uuuuu
方法中初始化对象的所有属性,因为这样更易于维护,而且当您不记得某个特定属性是定义的还是来自何处时,您总是知道应该在何处查找

在您的示例中,使用类将拥有的所有属性初始化类,然后调用方法来修改它们更有意义。例如:

class Button:
    def __init__(self):
        *snip*
        self.active = False
        self.color = 'red'
        self.linewidth = 2

    def activate(self):
        self.active = True
        self.color = 'green'
        self.linewidth = 5

    def deactivate(self):
        self.active = False
        self.color = 'red'
        self.linewidth = 2
现在您可能注意到我们有代码复制-
\uuuu init\uuu
方法基本上复制了
deactivate
方法中的行!尽管如此,在
\uuuu init\uuuu
方法中包含所有属性对于可读性来说还是很好的。我们该怎么办

考虑这种折衷方法:使用
None
值初始化所有属性,然后调用
deactivate
方法:

 class Button:
    def __init__(self):
        *snip*
        self.active = None
        self.color = None
        self.linewidth = None
        self.deactivate()

    def activate(self):
        self.active = True
        self.color = 'green'
        self.linewidth = 5

    def deactivate(self):
        self.active = False
        self.color = 'red'
        self.linewidth = 2
这结合了这两个方面的优点:我们的代码是可读的(
\uuuuu init\uuuuu
方法基本上读取“使用这些属性初始化按钮,然后将其停用”),但也没有代码重复


添加了一些关于为什么最好在
\uuuu init\uuuu
方法中创建所有属性的进一步见解。

是的,可以,但是为什么要这样做而不是在init方法中设置
self.active=False
?这是一个很好的问题-我正在编写Zelle Python编程第三版教科书,他就是这样安排的。他正在报道一个炮弹射击项目,并通过调用deactivate()方法初始化名为“active”的按钮状态的布尔实例变量,以便任何按钮都具有“active”=False的初始值。deactivate()方法还做了其他一些事情,即它为一些其他实例变量添加了更多的颜色和线宽格式,这些变量在初始化时会被deactivate()方法进一步强调。