如何正确使用浮点数作为基础 class 并为新的 class 定义方法?
How to correctly use a float as a base class and define methods for the new class?
如何执行以下操作:
def to_distance(speed, time):
return speed * time
speed = 10.0
to_distance(speed, 5)
在 class 的上下文中。也就是说,使用 class 和 int
的基数 class 并具有 to_distance
方法。以下尝试:
class Speed(float):
def __init__(self, n):
super().__init__(n)
def to_distance(self, n):
return self * n
运行:
s = Speed(11.0)
结果 TypeError
:
TypeError Traceback (most recent call last)
<ipython-input-18-4c35f2c0bca9> in <module>
----> 1 s = Speed(11.0)
<ipython-input-17-6baa46f60665> in __init__(self, n)
2
3 def __init__(self, n):
----> 4 super().__init__(n)
5
6 def to_distance(self, n):
TypeError: object.__init__() takes no arguments
你可以试试这个:
class Speed(float):
def __init__(self, n):
float.__init__(n)
def to_distance(self, n):
return self * n
测试和输出:
s = Speed(11.0)
dist = s.to_distance(5)
print(dist) # output 55.0
即使这似乎可行,尽管我有点困惑 - 也许对 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
编辑 - 在调用 s = Speed(2)
时将 print(self, n)
添加到 __init__
得到 2.0 2
。我认为正在发生的事情是 __new__
已经使 self
成为适当的值,因此 __init__
不再需要 n
。删除 super().__init__()
会导致与上面相同的结果,因此我们可以改为:
class Speed(float):
def to_distance(self, n):
return self * n
EDIT2 - 你可能想看看 this question.
如何执行以下操作:
def to_distance(speed, time):
return speed * time
speed = 10.0
to_distance(speed, 5)
在 class 的上下文中。也就是说,使用 class 和 int
的基数 class 并具有 to_distance
方法。以下尝试:
class Speed(float):
def __init__(self, n):
super().__init__(n)
def to_distance(self, n):
return self * n
运行:
s = Speed(11.0)
结果 TypeError
:
TypeError Traceback (most recent call last)
<ipython-input-18-4c35f2c0bca9> in <module>
----> 1 s = Speed(11.0)
<ipython-input-17-6baa46f60665> in __init__(self, n)
2
3 def __init__(self, n):
----> 4 super().__init__(n)
5
6 def to_distance(self, n):
TypeError: object.__init__() takes no arguments
你可以试试这个:
class Speed(float):
def __init__(self, n):
float.__init__(n)
def to_distance(self, n):
return self * n
测试和输出:
s = Speed(11.0)
dist = s.to_distance(5)
print(dist) # output 55.0
即使这似乎可行,尽管我有点困惑 - 也许对 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
编辑 - 在调用 s = Speed(2)
时将 print(self, n)
添加到 __init__
得到 2.0 2
。我认为正在发生的事情是 __new__
已经使 self
成为适当的值,因此 __init__
不再需要 n
。删除 super().__init__()
会导致与上面相同的结果,因此我们可以改为:
class Speed(float):
def to_distance(self, n):
return self * n
EDIT2 - 你可能想看看 this question.