如何正确使用float作为基类并为新类定义方法?

问题描述 投票:0回答:2

如何执行以下操作:

def to_distance(speed, time):
    return speed * time

speed = 10.0
to_distance(speed, 5)

在课堂上下文。也就是说,使用具有int基类并具有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
python python-3.x class inheritance base-class
2个回答
1
投票

即使这似乎有用,虽然我有点困惑 - 也许有更好的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

编辑 - 添加print(self, n)__init__2.0 2s = Speed(2)。我认为正在发生的是__new__已经使self成为适当的值,所以在n不再需要__init__。删除super().__init__()导致上面的结果相同,所以我们可以改为:

class Speed(float):
    def to_distance(self, n):
        return self * n

EDIT2 - 你可能想看看this question


0
投票

你可以试试这个:

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
© www.soinside.com 2019 - 2024. All rights reserved.