gpt4 book ai didi

Python 继承 : pass all arguments from base to super class

转载 作者:太空宇宙 更新时间:2023-11-04 01:02:29 25 4
gpt4 key购买 nike

我还不太习惯 Python 中的类继承。我想要做的只是在创建父类(super class)时将所有参数从我的基类传递给父类(super class):

class A:
def __init__(self, a, b):
self.a = a
self.b = b

def do(self):
c = self.a + self.b
return B(c=c)

class B(A):
def __init__(self, c):
self.c = c

my_A = A(a=1, b=2)
my_B = my_A.do()
print(my_B.c)

这按预期工作。但是,我想要的是还能够从类 my_B 的 x2 实例中调用参数 ab,这样我就可以直接编写 my_B .a 例如。我知道这是用 super() 像这样完成的:

class A:
def __init__(self, a, b):
self.a = a
self.b = b

def do(self):
c = self.a + self.b
return B(a=self.a, b=self.b, c=c)

class B(A):
def __init__(self, a, b, c):
super(B, self).__init__(a=a, b=b)
self.c = c

my_A = A(a=1, b=2)
my_B = my_A.do()
print(my_B.a)
print(my_B.b)

但是,我不想在创建 B 的实例时显式写入 A 的所有参数。有没有办法自动将所有参数从类 A 传递到类 B?

最佳答案

根据您的评论,您可以这样做:

class B(A):
def __init__(self, c, an_a):
super(B, self).__init__(an_a.a, an_a.b)
self.c = c

您可能更愿意保留当前的构造函数并添加一个 from_a 静态方法:

class B(A):
def __init__(self, c, a, b): # note order
super(B, self).__init__(a=a, b=b)
self.c = c

@staticmethod
def from_a(c, an_a):
return B(c, an_a.a, an_a.b)

最后,如果你不想把那些参数全部打出来,你可以在A中添加一个args()方法,然后使用集合解包功能语法:

class A:
...
def args(self):
return (self.a, self.b)

class B(A):
def __init__(self, c, *args): # Note *args
super(B, self).__init__(*args)
self.c = c

@staticmethod
def from_a(c, an_a):
return B(c, *an_a.args())

现在 B 的构造函数接受 B 的特殊参数,然后是任意数量的参数,这些参数刚刚传递给 A 的构造函数。这允许您在调用构造函数时进行元组解包,而不是手动列出所有内容。

关于Python 继承 : pass all arguments from base to super class,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32185528/

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