在 Python 中使用 Base Class 构造函数声明子类的优点
Advantages of Declaring Subclasses using Base Class Constructor in Python
使用带参数的基本 class 构造函数方法声明和初始化子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 中创建此特定任务,一个人会比另一个人更好吗?
您绝对应该在 __init__
方法中实例化和设置您 class。当 class 被(创建和)初始化时,如果可能的话,它应该准备好被使用。这就是人们对 class.
的期望
对于某些情况,例如当试图模仿不可变时,在 __init__()
调用后不应更新值。初始化后更新也有惩罚,因为更新可能需要触发其他更改。想象一个 GUI,其中输入之一是正在绘制的 window 的大小。如果在 Window 首次出现后设置,则必须重新绘制。
此外,您的第二种方法在另一个方面也很糟糕;在 __init__()
调用之后甚至没有 self.a
和 self.b
,因为您从未调用过 BaseClass.__init__()
。在继承和覆盖 __init__()
.
时,您应该始终这样做
您还应该考虑将对 BaseClass
的显式调用替换为对 super()
的调用(如您在评论中所写),因为这样可以更好地处理多重继承。
使用带参数的基本 class 构造函数方法声明和初始化子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 中创建此特定任务,一个人会比另一个人更好吗?
您绝对应该在 __init__
方法中实例化和设置您 class。当 class 被(创建和)初始化时,如果可能的话,它应该准备好被使用。这就是人们对 class.
对于某些情况,例如当试图模仿不可变时,在 __init__()
调用后不应更新值。初始化后更新也有惩罚,因为更新可能需要触发其他更改。想象一个 GUI,其中输入之一是正在绘制的 window 的大小。如果在 Window 首次出现后设置,则必须重新绘制。
此外,您的第二种方法在另一个方面也很糟糕;在 __init__()
调用之后甚至没有 self.a
和 self.b
,因为您从未调用过 BaseClass.__init__()
。在继承和覆盖 __init__()
.
您还应该考虑将对 BaseClass
的显式调用替换为对 super()
的调用(如您在评论中所写),因为这样可以更好地处理多重继承。