在声明类实例变量时,是否可以使用对类方法的调用来初始化构造函数中的一个实例变量?例如,假设我有一个Button类和methodA()类中的一个方法,该方法将名为'active‘的变量设置为False。我可以通过调用该方法来初始化“active”吗?
class Button:
def __init__(self):
*snip*
self.methodA()
def methodA(self):
self.active = False
这个技巧对于初始化我的实例变量'active‘是正确的吗?
发布于 2020-04-10 18:01:42
是的,这是可以做到的。事实上,在Python中,任何非静态方法都可以为类的对象初始化新的数据成员。但是,建议始终在__init__()
中初始化成员,因为在创建和初始化对象时初始化要使用的成员被认为是一种很好的做法。
发布于 2020-04-10 22:56:25
在你的评论中添加上下文后,你的问题就更有意义了。可以,您可以用另一种方法设置对象的任何属性。实际上,由于Python的动态类型,即使在初始化对象之后也可以设置它们:
class Example:
pass
e = Example()
e.foo = 'bar'
e.foo # returns 'bar'
但是,通常您希望在对象的__init__
方法中初始化对象的所有属性,因为它更易于维护,并且当您不记得是否定义了特定属性或该属性来自何处时,您总是知道在哪里查找。
在您的示例中,使用类所具有的所有属性来初始化类,然后调用方法来修改它们会更有意义。例如:
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
现在你可能注意到了,我们有代码复制-- __init__
方法基本上复制了deactivate
方法中的行!尽管如此,将所有属性都放在__init__
方法中对于提高可读性是非常有用的。我们该怎么办?
考虑以下折衷:使用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
这结合了两者的优点:我们的代码是可读的( __init__
方法基本上是“初始化具有这些属性的按钮,然后停用它”),但也没有代码重复。
This question进一步解释了为什么在__init__
方法中创建所有属性更可取。
https://stackoverflow.com/questions/61145836
复制