python:类范围中的函数

时间:2011-11-26 05:52:59

标签: python oop

我只是在玩这种语言,但想知道是否可以使用在类范围内定义的函数而不明确定义self作为第一个参数。

我理解实现类的“正确”方法可能是

class minimal:
    variable = 1    
    def add(self,x,y):
        return x+y
    def __init__(self,x):
        self.value = self.add(x,self.variable)

m = minimal(1)
print m.value
--> 2

但是,如果我以与add类似的方式定义和应用variable(在类的范围内),那么我会收到错误(预期):

class minimal:
    variable = 1
    def add(x,y):
        return x+y
    def __init__(self,x):
        self.value = self.add(x,self.variable)

m = minimal(1)
print m.value
--> TypeError: add() takes exactly 2 arguments (3 given)

有解决方法吗?或者通常建议通过明确引用self来定义所有内容(即self.variable=1方法中定义的__init__add定义的self参数)?

修正了

修改 __init__方法以在第二种情况下分配给self.value,而不是尝试返回值(无意)。

3 个答案:

答案 0 :(得分:4)

Yes,但don't

答案 1 :(得分:4)

第一个参数的名称是任意的。该对象始终作为第一个参数传递。声明add时,对象将作为x传递。当您致电self.add(x,self.variable)时,self被绑定到xx __init__中的y绑定add self.variable并且add作为第三个参数传递,class minimal: variable = 1 def add(x,y, *args): print('x: %s;\ny: %d;\nargs: %s;\n' % (x, y, args)) def __init__(self,x): self.add(x,self.variable) 未声明。

self
>>> minimal(2)
x: <__main__.minimal object at 0x1006e6e90>;
y: 2;
args: (1,);

总之,即使您取消{{1}}作为第一个参数,您仍然可以将对象作为方法的第一个参数传递。

答案 2 :(得分:1)

您可以将方法标记为静态,请尝试以下方法:

class minimal:
  variable = 1

  @staticmethod
  def add(x,y):
    return x+y

  def __init__(self,x):
    print self.add(x,self.variable)

m = minimal(1)

虽然我对此进行了更改,但您的 init 方法不会返回值,而不应该返回该值。