Как правильно использовать float в качестве базового класса и определить методы для нового класса? - PullRequest
0 голосов
/ 12 апреля 2019

Как выполнить ниже:

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

Ответы [ 2 ]

1 голос
/ 12 апреля 2019

Даже это, кажется, работает, хотя я немного сбит с толку - может быть, кто-то с лучшим знанием внутренних компонентов 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 - возможно, вы захотите взглянуть на этот вопрос .

0 голосов
/ 12 апреля 2019

вы можете попробовать это:

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
...