2013-09-04 3 views
0

Это мой код:Как исправить мой математический класс?

class math(): 
    def __init__(self, x, y): 
     self.x = x 
     self.y = y 
class pythagorus(math): 
    def __init__(self, x, y): 
     math.__init__(self, x, y) 
    def __str__(self): 
     import math 
     return math.sqrt(x**2+y**2) 

q = pythagorus(4, 5) 
print(q) 

Как сделать функцию из класса, если это имеет смысл, я хочу, чтобы вернуть результат Math.sqrt (х * 2 + у * 2), но я не могу заставить его работать? Заранее спасибо!

+2

Почему бы не просто сделать его функцией? 'def pythagoras (x, y): return math.sqrt (x ** 2 + y ** 2)'? –

+0

, потому что я уже знаю, как использовать функции, я пытаюсь научиться реализовывать свои старые программы с классами на практике :) – samir

ответ

1

Вам необходимо обратиться к self доступа к атрибутам на классе:

class pythagoras(math): 
    def __str__(self): 
     import math 
     return str(math.sqrt(self.x**2 + self.y**2)) 

__str__ метод должен возвращают строковое значение, поэтому использование __str__ для этого немного .. странно. Не нужно переопределять метод __init__, вы не сделали ничего нового в нем.

Вы можете назвать свою базового класса нечто иное, чем math, так что вы не маскировать модуль (и не нужно импортировать его в методе __str__). Лучшей практикой является использование имен CamelCase для классов; Math - лучший выбор.

Для такого рода операции, я бы просто использовать функцию вместо:

import math 

def pythagoras(x, y) 
    return math.sqrt(x**2 + y**2) 

В лучшем случае, вы бы сделать pythagorasметод на своем математическом классе:

import math 

class Math(): 
    def __init__(self, x, y): 
     self.x, self.y = x, y 

    def pythagoras(self): 
     return math.sqrt(self.x ** 2 + self.y ** 2) 
0

Если у вас абсолютно необходимо, выполните следующие действия: исправьте следующее:

  1. Не смешивать имена - math является одновременно модулем и классом. Используйте другое имя.
  2. math.__init__(self, x, y) не имеет смысла. Для инициализации ваших членов, унаследованных от родительского класса, используйте super(). В этом случае вам не нужно это делать, поскольку вы ничего не делаете, кроме того, что делает конструктор родительского класса.
  3. str должен возвращать строку.

С этой целью:

import math 
class Point(): 
    def __init__(self, x, y): 
     self.x = x 
     self.y = y 

class Pythagorus(Point): 
    def __init__(self, x, y): 
     # Possibly other things need to be done, but not in this case. 
     super().__init__(x, y) 

    def __str__(self): 
     return str(math.sqrt(self.x ** 2 + self.y ** 2)) 

Я настоятельно рекомендую использовать простой дизайн для этого, как функция, если вы не обязаны делать это таким образом (например, домашнее задание).

0

Вам не нужно переопределять __init__ на дочернем классе, так как вы не меняете реализацию.

Поскольку ваш метод __str__ является общим, он должен быть частью родителя. Ребенок должен просто реализовать определенные функциональные возможности объекта.

import math as _math 

class Math(): 
    """ A generic math class """ 
    def __init__(self, x, y): 
     self.x = x 
     self.y = y 
     self.result = 0 

    def __str__(self): 
     return str(self.result) 

class Pythagorus(Math): 
    def calculate(self): 
     self.result = _math.sqrt(self.x ** 2 + self.y ** 2) 

obj = Pythagorus(8,5) 
obj.calculate() 
print(obj) 
Смежные вопросы