魔术方法可以 return 不同的结果类型吗?

Can magic methods return different result type?

def __sub__() 这样对类型 return 进行操作的魔术方法可以是不同的结果类型吗?

例如,在下面的 class 用户中,-1 运算符 return 是一个字符串。要求是如果存在差异 return 显示差异表示的字符串。

import copy
class User:
    def __init__(self, username=""):
        self.__user_name = username
    
    def __sub__(self,other):
        if other.__user_name != self.__user_name:
            return "User name changed from {} to {}".format(self.__user_name,
            other.__user_name);
        else:
            return ""
            
    def set_user_name(self, username):
        self.__user_name = username
            
            
user_1 = User("John")
user_2 = copy.copy(user_1)
user_2.set_user_name("Tom")
user_diff = user_1 - user_2

之后如果我们打印 user_diff 它将是“用户名从 John 更改为 Tom”。

这是允许的并且是显示差异的方式之一,主要是'-' returning 与 User 相比不同的对象类型(字符串)?

当然:标准库中的一个突出示例是 datetime.__sub__,其中 returns 一个 timedelta 实例,而另一个操作数是另一个 datetime 实例。

>>> d1 = datetime.datetime.now()
>>> d2 = datetime.datetime.now()
>>> type(d2 - d1)
<class 'datetime.timedelta'>