gpt4 book ai didi

python - 类继承 - 所有继承的方法都可以转换为子类类型吗?

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

假设我想创建我自己的现有类版本。让我们选择内置的 float 类。在此示例中,我将创建一个类似 float 的类,该类在除以零时不会引发错误,而是返回字符串“inf”(请记住,这只是一个示例。避免除以零错误并不是此示例的要点问题)。

class myfloat(float):
def __truediv__(self, b):
if b == 0:
return 'inf'
else:
return myfloat(self.__float__() / b)

当除法与 int 或 float 结合使用时,它也有效。

In[88]: a = myfloat(10)
In[89]: a / 2
Out[89]: 5.0
In[90]: a / 0
Out[90]: 'inf'

但是,由于继承自float类,当我进行任何其他操作(即方法)时,结果将是一个float。例如:

In[92]: b = myfloat(20)
In[93]: (a + b) / 0
ZeroDivisionError Traceback (most recent call last)
<ipython-input-6-f769cd843514> in <module>()
----> 1 (a + b) / 0

ZeroDivisionError: float division by zero

与从父 float 类继承的方法相比,addition 方法仍然没有改变,显然返回的是 float。

所以我的问题是:是否有一种巧妙的方法可以使子类中的所有继承方法返回子类中的结果,而不需要重写所有方法?我在想类似装饰器 @myfloat 的东西会自动应用于所有(适用的)继承方法,以将其结果从类型 float 转换为类型 myfloat

最佳答案

这是一种使用装饰器的方法,可以将需要类型转换的每个方法的工作量减少到一行。它甚至结合了 @Graipher 的 self.__class__ 提示,这使得装饰器可以在您有一天重命名 myfloat 时无需更改即可工作。

def cast_return(func):
""" Decorator that casts the return value of a special __method__
back to the original type of 'self'. """
def wrapped(self, *args, **kwargs):
return self.__class__(func(self, *args, **kwargs))
return wrapped

class myfloat(float):
def __truediv__(self, b):
if b == 0:
return 'inf'
else:
return myfloat(self.__float__() / b)

__mul__ = cast_return(float.__mul__)
__add__ = cast_return(float.__add__)
# repeat for all the needed operations

然后你会得到...

In [1]: (myfloat(3.3) +  4) / 0
Out[1]: 'inf'

人们甚至可以更进一步,列出这些函数,将它们全部在一个循环中进行类型转换,但我认为它们没有那么多。

但是:

如果另一种类型来处理该操作,它仍然不起作用,如下所示:

In [1]:(4 + myfloat(3.3)) / 0
---------------------------------------------------------------------------
ZeroDivisionError Traceback (most recent call last)
<ipython-input-45-6537eb18ab79> in <module>()
16 __add__ = cast_return(float.__add__)
17
---> 18 (4 + myfloat(3.3)) / 0

ZeroDivisionError: float division by zero

我真的不知道是否有办法解决这个问题。

关于python - 类继承 - 所有继承的方法都可以转换为子类类型吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49027131/

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