gpt4 book ai didi

python - 如何在不覆盖父函数的情况下将值返回给父类(super class)?

转载 作者:行者123 更新时间:2023-11-30 22:55:34 25 4
gpt4 key购买 nike

我想定义一个与其父函数同名的函数,该函数返回父函数可以接收和使用的值。虽然我认为可以通过元类来实现这一点,但我不确定如何做到这一点(假设这是可能的)以及是否有更好、更干净的解决方案。

我想要的格式如下所示。 Child 类将由我以外的开发人员定义,因此我希望限制尽可能少。 (例如,我理想情况下不希望使用 super(Child).f(a) 来替换 return a。)我也不确定如何使用关键字参数与我的模型,这会更好。

class Parent:
def f(self, arg):
print("Received {}.".format(arg))
return arg ** 3

class Child(Parent):
def f(self, c, b, a):
print(a, b, c)
return a

# Prints "2 1 0" and "Received 2.". Sets value to 8.
value = Child().f(0, 1, 2)

最佳答案

此声明有一个关键问题:

I would like to define a function with the same name as its parent which returns a value that the parent can receive

请问,为什么需要这样做?

Child 类中的 f 与 Parent 类中的 f 完全不同,因此即使您确实让它工作,将它们命名为相同的东西也是非常困惑的。

假设我使用您的Parent编写了子类:

class Child(Parent):
def f(self):
return 2

我希望 Child().f() 返回 2,但如果您在幕后添加隐藏逻辑,添加 arg ** 3 那么我会相反,得到 8 并完全困惑并诅咒你的库添加了非常不直观的规则。

<小时/>

为什么不使用一个函数并在子类中定义额外的逻辑辅助函数:

class Parent:
def f(self, *v_args):
arg = self.helper_f(*v_args)
print("Received {}.".format(arg))
return arg ** 3

def helper_f(self,*args):
"really should be an abstract method, must be implemented in a subclass"
raise NotImplementedError("Must override in a subclass!")

class Child(Parent):
def helper_f(self, c, b, a):
print(a, b, c)
return a

# Prints "Received 2.". Sets value to 8.
value = Child().f(0, 1, 2)

当然,是的,从技术上讲,您可以使用元类自动执行此操作。但同样,对于使用您的 Parent 类的任何人来说,这都会完全令人困惑

class Child_Method_Redirector(type):
def __new__(meta, name, bases, cls_dict):
if bases is not ():
if "f" in cls_dict:
cls_dict["_auto_renamed_helper_f"] = cls_dict["f"]
del cls_dict["f"]
return type.__new__(meta,name,bases,cls_dict)


class Parent(metaclass=Child_Method_Redirector):
def f(self, *v_args):
arg = self._auto_renamed_helper_f(*v_args)
print("Received {}.".format(arg))
return arg ** 3

class Child(Parent):
def f(self):
return 2

# now it does Print "Received 2." and Sets value to 8.
value = Child().f()

但是请不要这样做,这违背了 the zen

Explicit is better than implicit.
There should be one-- and preferably only one --obvious way to do it.
If the implementation is hard to explain, it's a bad idea.

关于python - 如何在不覆盖父函数的情况下将值返回给父类(super class)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37379934/

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