派生类是否自动具有基类的所有属性?
|
似乎没有关于此的好的在线文档:
如果我创建派生类,它将自动具有基类的所有属性吗?但是ѭ0的作用是什么,您还需要对其他基类方法进行处理吗?
BaseClass.__init__()
需要论证吗?如果您有基类__init__()
的参数,派生类也使用它们吗,是否需要将参数显式设置为派生类的__init__()
或将其设置为BaseClass.__init__()
?
没有找到相关结果
已邀请:
2 个回复
栖很钾是狠
,则它将覆盖继承的
方法,因此将永远不会调用
。如果您需要为BaseClass调用
方法(通常是这种情况),那么您就可以做到这一点,通常通过在新实现的
方法中调用calling7ѭ来明确地做到这一点。
这将导致以下错误:
因此,
方法已按预期方式继承,但是该方法要求已设置属性ѭ14,,这绝不是因为
也被覆盖了。我们通过在
内显式调用
来解决此问题。
按预期打印print19ѭ。在这种情况下,
需要一个单独的参数,该参数是
的实例(按照惯例称为convention22ѭ)。 通常,当您在类的实例上调用方法时,该类实例将作为第一个参数自动传递。类实例上的方法称为绑定方法。
是绑定方法的一个示例(您会注意到它被调用时没有任何参数)。
是未绑定的方法,因为它未附加到
的特定实例,因此第一个参数argument21ѭ的实例需要显式传递。 在我们的例子中,我们将
传递给
,这是
的实例,并已在
中传递给
方法。由于
继承自
,因此
的实例也是also21ѭ的实例,因此允许将
传递给
。 您从中继承的类很可能需要或接受的参数不仅仅是该类的实例。这些问题的处理方式与您在ѭ5范围内调用的任何方法一样:
它会打印
。 如果您要尝试实现一个通过继承类完全公开基类的所有初始化参数的接口,则需要明确地这样做。通常使用* args和** kwargs参数(名称是按惯例)完成的,它们是未明确命名的所有其他参数的占位符。以下示例利用了我已经讨论的所有内容:
在这种情况下,参数
设置为40,因为它是
的第一个参数。然后将第二个参数合并到变量
和
中(*和**是特定语法,表示传递给函数/方法时,将列表/元组或字典扩展为单独的参数),然后传递给
。 此示例还指出,如果需要,则必须显式调用任何被覆盖的方法(在这种情况下为
)。 最后一点,您经常会看到使用
(其中
是任意的子类)而不是显式调用
方法。对ѭ51的讨论是另一个完全不同的问题,但足以说,在这种情况下,通常将其用于完全通过调用ѭ52来完成所要做的事情。简而言之,“ 51”按方法解析顺序将方法调用委托给下一个类-MRO(在单个继承中为父类)。有关更多信息,请参见super上的文档。
丧泉缝锋
,则至少需要传递
作为第一个参数。如果你有
显然,“ 5”没有接受其他论点。如果你有
则呼叫基数
时必须通过
。这里没有火箭科学。 如果您有基类init()的参数,派生类也使用它们,是否需要将参数显式设置为派生类的init()或将其设置为BaseClass.init()呢? ? 同样,如果派生类没有
,将使用基数代替。
在其他情况下,您需要以某种方式进行处理。是否使用ѭ65并仅将未经修改的参数传递给基类,还是复制基类签名,还是从其他位置提供参数,取决于您要完成的工作。