我只是在玩这种语言,但想知道是否可以使用在类范围内定义的函数而不明确定义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
,而不是尝试返回值(无意)。
答案 0 :(得分:4)
答案 1 :(得分:4)
第一个参数的名称是任意的。该对象始终作为第一个参数传递。声明add
时,对象将作为x
传递。当您致电self.add(x,self.variable)
时,self
被绑定到x
,x
__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 方法不会返回值,而不应该返回该值。