gpt4 book ai didi

Python继承结构和参数

转载 作者:太空宇宙 更新时间:2023-11-03 19:48:22 25 4
gpt4 key购买 nike

我正在尝试设计一个类结构,允许用户定义自己的类,以重载其他类中的预定义方法。在这种情况下,用户将创建 C 类来重载 D 中的“函数”方法。用户创建的 C 类与其他用户创建的类 A 和 B 具有共同的逻辑,因此它们继承自 C 来重载“函数”,但也继承自D使用D的其他方法。我遇到的问题是如何将“值”从 A 和 B 传递到 D 并忽略将其传递给 C。我当前编写的内容将产生错误,因为 C 没有“值”作为参数。

我知道我可以向 C 的 init 方法和 super 调用添加“值”(或 *args),但我不想知道其他类需要什么输入才能向 A 和 B 添加新类另外,如果我交换 C 和 D 的顺序,我不会收到错误,但我不会使用 C 的重载“函数”。有没有明显的方法可以解决这个问题?

class D(SomethingElse):
def __init__(self, value, **kwargs):
super(D, self).__init__(**kwargs)

self.value = value

def function(self):
return self.value

def other_method(self):
pass

class C(object):
def __init__(self):
super(C, self).__init__()

def function(self):
return self.value*2

class B(C, D):
def __init__(self, value, **kwargs):
super(B, self).__init__(value, **kwargs)

class A(C, D):
def __init__(self, value, **kwargs):
super(A, self).__init__(value, **kwargs)



a = A(3)
print(a.function())
>>> 6

最佳答案

本质上,您需要做两件事才能使您的 __init__ 方法与 Python 中的多重继承配合良好:

  1. 始终采用 **kwargs 参数,并始终调用 super().__init__(**kwargs)even if you think you are the base class 。仅仅因为您的父类(super class)是 object 并不意味着您是 method resolution order 中的最后一个(在 object 之前)。 .
  2. 不要显式传递父类的 __init__ 参数; only pass them via **kwargs 。您的父类不一定是方法解析顺序中紧随您之后的下一个类,因此位置参数可能会传递给错误的其他 __init__ 方法。

这称为“协作子类化”。让我们尝试一下您的示例代码:

class D:
def __init__(self, value, **kwargs):
self.value = value
super().__init__(**kwargs)

def function(self):
return self.value

class C:
# add **kwargs parameter
def __init__(self, **kwargs):
# pass kwargs to super().__init__
super().__init__(**kwargs)

def function(self):
return self.value * 2

class B(C, D):
# don't take parent class's value arg explicitly
def __init__(self, **kwargs):
# pass value arg via kwargs
super().__init__(**kwargs)

class A(C, D):
# don't take parent class's value arg explicitly
def __init__(self, **kwargs):
# pass value arg via kwargs
super().__init__(**kwargs)

演示:

>>> a = A(value=3)
>>> a.value
3
>>> a.function()
6

请注意,value 必须作为关键字参数(而不是位置参数)传递给 A 构造函数。还建议在调用 super().__init__ 之前设置 self.value = value

我还将 class C(object): 简化为 class C:,并将 super(C, self) 简化为 super() 因为它们在 Python 3 中是等效的。

关于Python继承结构和参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59996699/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com