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

问题描述 投票:0回答:1

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

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中创建这个特定任务,那会更好吗?

python class oop subclass base-class
1个回答
2
投票

你绝对应该在__init__方法中实例化并设置你的类。当(创建并)初始化类时,如果可能的话,应该准备好使用它。这就是人们对课程的期望。

对于某些情况,例如当试图模仿不可变时,在__init__()调用之后,值永远不应该更新。初始化后更新还有一个问题,因为更新可能需要触发其他更改。想象一下GUI,其中一个输入是正在绘制的窗口的大小。如果在Window首次出现后设置,则必须重绘。

另外,你的第二种方法是另一种方式;在self.a召唤之后你甚至没有self.b__init__(),因为你从来没有打电话给BaseClass.__init__()。在继承和覆盖__init__()时,您应该始终这样做。

您还应该考虑将BaseClass的显式调用替换为super()(因为您已将其作为注释编写),因为它将更好地处理多重继承。

© www.soinside.com 2019 - 2024. All rights reserved.