__init__ 和 Python 中的参数
Posted
技术标签:
【中文标题】__init__ 和 Python 中的参数【英文标题】:__init__ and arguments in Python 【发布时间】:2011-07-07 08:33:39 【问题描述】:我想了解 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()
方法不需要参数。
我必须使用无意义的论据吗?
【问题讨论】:
它们并非毫无意义。类的每个方法总是有一个隐含的参数,即实例。在 C++ 中它是一样的,但你永远不会在参数列表中看到它,因为它神奇地出现在童话森林的灌木丛中。 Python 是Explicit is better than implicit
。
你可以使用@staticmethod 和@classmethod 装饰器来做你想做的事。请参阅我的答案中的示例。
即使您将方法命名为 init(self,param),如果您不缩进 def 并因此不缩进 init 方法不在类中...
【参考方案1】:
在 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
s,那么更 Python 的做法是创建相关函数的新模块。
【讨论】:
我认为您的回答有几点值得强调。我希望你不介意这些改进:)!感谢您的回答!【参考方案2】:每个方法都需要接受一个参数:实例本身(或类,如果它是静态方法)。
Read more about classes in Python.
【讨论】:
【参考方案3】:您的方法不使用 self
参数(这是对该方法所附加到的实例的引用)这一事实并不意味着您可以忽略它。它总是必须在那里,因为 Python 总是会尝试将它传递进来。
【讨论】:
【参考方案4】:在python中,你必须始终将至少一个参数传递给类方法,参数是self
,它对实例本身的引用并非没有意义
【讨论】:
【参考方案5】:当前对象作为第一个参数显式传递给方法。 self
是常规名称。您可以随意称呼它,但强烈建议您遵守此约定以避免混淆。
【讨论】:
【参考方案6】:如果你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
是同一个对象
【讨论】:
以上是关于__init__ 和 Python 中的参数的主要内容,如果未能解决你的问题,请参考以下文章