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(x* 2+y *2) 的结果,但我似乎无法让它工作?提前致谢!

4

3 回答 3

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)
于 2013-09-04T09:56:05.623 回答
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)
于 2013-09-04T10:20:59.570 回答
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))

我强烈建议为此使用简单的设计,例如函数,除非您需要这样做(例如家庭作业)。

于 2013-09-04T10:07:44.947 回答