我想理解Python中构造函数__init__
的参数。
class Num:
def __init__(self,num):
self.n = num
def getn(self):
return self.n
def getone():
return 1
myObj = Num(3)
print myObj.getn()
结果:3
我调用getone()
方法:
print myObj.getone()
结果:错误'getone()'不带参数(1given)。
所以我更换:
def getone():
return 1
与
def getone(self):
return 1
结果:1这没关系。
但是getone()
方法不需要参数。
我是否必须使用毫无意义的论点?
答案 0 :(得分:43)
在Python中:
self
参数。self
)或类(cls
)参数。 __init__
是一个特殊的函数,如果没有覆盖__new__
,它将始终被赋予该类的实例作为其第一个参数。
使用内置classmethod和staticmethod装饰器的示例:
import sys
class Num:
max = sys.maxint
def __init__(self,num):
self.n = num
def getn(self):
return self.n
@staticmethod
def getone():
return 1
@classmethod
def getmax(cls):
return cls.max
myObj = Num(3)
# with the appropriate decorator these should work fine
myObj.getone()
myObj.getmax()
myObj.getn()
那就是说,我会尽量少用@classmethod
/ @staticmethod
。如果您发现自己创建的对象除了staticmethod
之外什么都没有,那么pythonic要做的就是创建一个相关函数的新模块。
答案 1 :(得分:6)
每个方法都需要接受一个参数:实例本身(如果是静态方法,则为类)。
答案 2 :(得分:4)
您的方法不使用 self
参数(这是对该方法附加的实例的引用)这一事实并不意味着您可以将其删除。它总是必须存在,因为Python总是试图传递它。
答案 3 :(得分:2)
在python中,你必须总是将至少一个参数传递给类方法,参数是self
,并且它对实例本身的引用并没有意义
答案 4 :(得分:2)
当前对象作为第一个参数显式传递给方法。 self
是常规名称。您可以随意调用它,但强烈建议您坚持使用此约定以避免混淆。
答案 5 :(得分:1)
如果您print(type(Num.getone))
,将获得<class 'function'>
。
这只是一个简单的函数,可以像往常一样调用(不带参数):
Num.getone() # returns 1 as expected
但是如果您打印print(type(myObj.getone))
,则会得到<class 'method'>
。
因此,当您从类的实例调用getone()
时,Python会自动将类中定义的函数“转换”为方法。
实例方法要求第一个参数是实例对象。您可以将myObj.getone()
视为的语法糖
Num.getone(myObj) # this explains the Error 'getone()' takes no arguments (1 given).
例如:
class Num:
def __init__(self,num):
self.n = num
def getid(self):
return id(self)
myObj=Num(3)
现在就可以了
print(id(myObj) == myObj.getid())
# returns True
您可以看到self
和myObj
是同一对象