在Python中使用基类构造函数声明子类的优点

时间:2019-03-27 05:31:52

标签: python class oop subclass base-class

使用具有参数的基类构造函数方法声明和初始化子类是否有任何优势:

class BaseClass(object):
  def __init__(self, a, b):
    self.a = a
    self.b = b

class SubClass(BaseClass):
  def __init__(self, a, b, c, d):
    BaseClass.__init__(self, a, b)
    # or super().
    self.c = c
    self.d = d

newSubClassInstance = SubClass("one", "two", "three", "four")

完全不使用参数,而是按如下所示进行初始化:

class BaseClass(object):
  def __init__(self):
    self.a = " "
    self.b = " "

class SubClass(BaseClass):
  def __init__(self):
    self.c = " "
    self.d = " "

newSubClassInstance = SubClass()
newSubClassInstance.a = "one"
newSubClassInstance.b = "two"
newSubClassInstance.c = "three"
newSubClassInstance.d = "four"

还是取决于人们打算如何在程序中编写和使用此代码?我主要是在询问期望。例如,如果有人要求在Python中创建此特定任务,一个人会比另一个人更好吗?

1 个答案:

答案 0 :(得分:2)

您绝对应该实例化并设置__init__方法中的类。当(创建和)初始化该类时,应尽可能准备使用它。那是人们对一堂课的期望。

在某些情况下,例如在尝试模仿不可变对象时,请勿在{{1​​}}调用后更新值。初始化后进行更新也有一个缺点,因为更新可能需要触发其他更改。想想GUI,其中输入之一就是绘制的窗口的大小。如果在窗口首次出现后设置了该值,则必须重新绘制它。

另外,您的第二种方法在另一个方面是不好的;您甚至在__init__()之后就没有self.aself.b了,因为您从未呼叫过__init__()。在继承和覆盖BaseClass.__init__()时,应该始终执行此操作。

您还应该考虑将对__init__()的显式调用替换为对BaseClass的调用(就像您写为注释一样),因为这样可以更好地处理多个继承。