__init__和Python中的参数

时间:2011-03-02 14:55:58

标签: python class oop instance

我想理解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()方法不需要参数。

我是否必须使用毫无意义的论点?

6 个答案:

答案 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)

每个方法都需要接受一个参数:实例本身(如果是静态方法,则为类)。

Read more about classes in Python

答案 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

您可以看到selfmyObj是同一对象