Даже это, кажется, работает, хотя я немного сбит с толку - может быть, кто-то с лучшим знанием внутренних компонентов Python может вмешаться?
class Speed(float):
def __init__(self, n):
super().__init__()
def to_distance(self, n):
return self * n
s = Speed(2)
print(s) # 2.0
print(isinstance(s, float)) # True
print(s ** 2) # 4.0
z = s - 2
print(isinstance(z, Speed)) # False
print(isinstance(z, float)) # True
print(s.to_distance(3)) # 6.0
EDIT - добавление print(self, n)
к __init__
дает 2.0 2
при вызове s = Speed(2)
. Я думаю, что происходит то, что __new__
уже превратил self
в соответствующее значение, поэтому n
больше не требуется при __init__
. Удаление super().__init__()
приводит к тому же результату, что и выше, поэтому мы могли бы получить это вместо:
class Speed(float):
def to_distance(self, n):
return self * n
EDIT2 - возможно, вы захотите взглянуть на этот вопрос .