python - 在 Python 中使用基类构造函数声明子类的优点
问题描述
使用带参数的基类构造方法声明和初始化子类有什么好处:
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 中创建这个特定任务,一个会比另一个更好吗?
解决方案
您绝对应该在__init__
方法中实例化并设置您的类。当类被(创建和)初始化时,如果可能的话,它应该准备好使用。这就是人们对课堂的期望。
在某些情况下,例如当试图模仿不可变对象时,值不应在__init__()
调用后更新。初始化后更新也有惩罚,因为更新可能需要触发其他更改。考虑一个 GUI,其中一个输入是正在绘制的窗口的大小。如果在 Window 首次出现后设置,则必须重新绘制它。
另外,您的第二种方法在另一方面也很糟糕;你甚至没有打电话后的self.a
and ,因为你从来没有打电话。在继承和覆盖时,您应该始终这样做。self.b
__init__()
BaseClass.__init__()
__init__()
您还应该考虑将显式调用替换BaseClass
为调用super()
(正如您作为评论所写),因为这样可以更好地处理多重继承。
推荐阅读
- css - 弹性项目的宽度正在缩小
- c++ - 指向派生类的抽象bass类的shared_ptr向量
- javascript - 阅读更多切换按钮
- typo3 - 更新 Typo3 8.7.31 后 - 后端没有页面树
- r - 根据数据分布寻找合适的聚类方法
- kibana - 将 OpenID 用户添加到 Open Distro Kibana
- android - 如何在颤动的降价中添加超链接到文本
- r - ggplot2 中 annotate() 的默认单位是什么?
- node.js - 命名空间中的所有套接字是否都连接到 socket.io 中服务器上的同一端口?
- node.js - 为什么在 docker run as root 中创建具有不同所有权的文件/文件夹?