2011-03-02 56 views
23

我想了解Python中构造函数__init__的参数。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() 

RESULT:错误 'getone()' 不带参数(1given)。

所以我代替:

def getone(): 
    return 1 

def getone(self): 
    return 1 

结果:1这是可行的。

getone()方法不需要参数。

我必须使用毫无意义的论据吗?

+6

它们不是毫无意义的。每个类的方法总是有一个隐含的参数,即实例。在C++中它是一样的,但你永远不会在参数列表中看到它,因为它神奇地出现在仙女森林的灌木丛中。Python是'显式优于隐式'的。 – 2011-03-02 15:01:02

+1

你可以使用@staticmethod和@classmethod装饰器来做你想做的事。请参阅我的答案中的示例。 – stderr 2011-03-02 15:13:11

回答

31

Python实例方法需要自我参数。类方法将类作为第一个参数。静态方法不需要实例(self)或类(cls)参数。

__init__是一个特殊功能,并且不会覆盖__new__它总是会被赋予类的实例作为它的第一个参数。

使用内置类方法和静态方法装饰的一个例子:

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将会创建一个相关函数的新模块。

3

在Python必须经过至少一个参数类方法,参数为self,这是没有意义的,以该实例本身

4

,你的方法不使用的事实参考self参数(这是对该方法所附的实例的引用)并不意味着您可以将其忽略。它总是在那里,因为Python总是试图通过它。

2

当前对象作为第一个参数显式传递给方法。 self是传统名称。你可以任意调用它,但强烈建议你坚持这个约定以避免混淆。