__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。如果您发现自己创建的对象只包含 staticmethods,那么更 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

如您所见,selfmyObj 是同一个对象

【讨论】:

以上是关于__init__ 和 Python 中的参数的主要内容,如果未能解决你的问题,请参考以下文章

python构造函数

“超级”对象的描述符“__init__”需要参数

Python说文解字_继承过程中的参数集合

Python中的对象行为与特殊方法对象的创建与销毁

Python:动态创建类,同时为 __init__subclass__() 提供参数

详解Python中的__new__、__init__、__call__三个特殊方法