Python类,基本

时间:2015-08-07 06:54:28

标签: python class python-2.7 python-3.x

我尝试创建一个复数类。我在类中有一个add方法,它在添加后返回一个新的复数,而不改变参数复数。

class complex:
    real = 0.00
    imag = 0.00

    def __init__ (self,r,i):
        complex.real = r
        complex.imag = i

    def add(comp1, comp2):
        x = comp1.real + comp2.real
        y = comp1.imag + comp2.imag
        result = complex(x,y)
        return result

此代码有问题。我找不到它了。请告诉我哪里出错了。

enter image description here

我也试过传递自我对象,但它没有起作用。 def add(self, comp):

3 个答案:

答案 0 :(得分:2)

class complex:
    real = 0.00
    imag = 0.00

    def __init__ (self,r,i):
        complex.real = r
        complex.imag = i
  1. 您正在使用complex的所有实例全局相同的类属性。您只想将这些值分配给self,而不是complex本身。
  2. def add(comp1, comp2):
        x = comp1.real + comp2.real
        y = comp1.imag + comp2.imag
        result = complex(x,y)
        return result
    
    1. 您错过了self参数,或者您想要制作方法a @staticmethod
    2. 正确实施:

      class Complex:
          def __init__ (self, real=0.00, imag=0.00):
              self.real = real
              self.imag = imag
      
          def add(self, comp):
              return Complex(self.real + comp.real, self.imag + comp.imag)
      
      
      c1 = Complex(1, 2)
      c2 = Complex(3, 4)
      c3 = c1.add(c2)
      

答案 1 :(得分:1)

当你这样做时 -

complex.real = r
complex.imag = i

这就是您遇到问题的原因,当您创建complex类的新实例时,该类的realimag值会更改为新值,这是反映在复杂对象的所有实例中。

realimag实际上是类变量,它们在类的所有对象/实例中共享。您应该将它们定义为实例变量 -

def __init__ (self,r,i):
    self.real = r
    self.imag = i

self指向当前实例,因此当您执行时 - self.real它指向当前实例/对象的real变量。

答案 2 :(得分:1)

__init__中,您应该引用self而不是complex来获取对象/动态属性,否则您将其修改为类/静态属性:

def __init__ (self,r,i):
    self.real = r
    self.imag = i