Python 新手:有人知道 __init__(self) 做啥吗? (请简单解释!)[重复]

Posted

技术标签:

【中文标题】Python 新手:有人知道 __init__(self) 做啥吗? (请简单解释!)[重复]【英文标题】:New to Python: Anyone know what __init__(self) does? (simple expl. please!) [duplicate]Python 新手:有人知道 __init__(self) 做什么吗? (请简单解释!)[重复] 【发布时间】:2012-07-25 07:28:48 【问题描述】:

可能重复:Python init and self what do they do?

谁能解释__init__(self) 的作用?我一直在阅读其他问题和提到超级课程的人?什么是超级班?我认为程序应该从

开始
def print_word(word):
    print word

__init__(self) 是某种特殊情况,因为它有下划线和“自我”吗?抱歉缺少具体的术语……仍在学习中。

【问题讨论】:

【参考方案1】:

可能重复:Python __init__ and self what do they do?

def print_word(word) 是一个函数(或方法/过程)。 __init__(self) 是一个在中使用的函数。

Python 类教程的section 描述了__init__ 函数。我强烈建议您阅读整个页面,顺便说一句。

self 是任意选择一个词来引用类本身;如果你愿意,你可以使用watermelon。见:What is the purpose of self?

用双下划线包裹的 Python 类函数具有特殊含义。另一个例子是__str__。 PEP8(Python 风格的重要文档)的这个section 解释了 Python 中下划线的含义。


超类:

Python类教程的继承section How do I initialize the base (super) class?

【讨论】:

【参考方案2】:

要了解__init__(self, ...) 的作用,您必须先了解类。

一个类基本上定义了一种对象。例如,如果我想定义 Fish 的行为方式,我可能会从以下形式开始

class Fish:
    def swim(self):
        print "I'm swimming!"
    def breathe(self):
        print "I'm breathing!"

然而,这不是一个非常有用的类,因为虽然我们已经定义了 Fish 可以做什么,但我们不知道如何存储有关 Fish 的其他基本特性,例如它有多重。

原则上,如果我有一个名为fFish,我可以这样做

f.weight = 3

但是,如果我忘记对某些 Fish 执行此操作,例如命名为 gFish,然后尝试在表达式中使用 g.weight,Python 将不会很高兴 - 它会抛出一个AttributeError 抱怨Fish instance has no attribute 'weight'

为避免这种情况,我们可以为我们的类定义一个构造函数,每次创建一个新的Fish 时,都会将其权重和颜色等属性设置为合理的默认值价值观。在 Python 中,这个构造函数被称为__init__。只要在类中定义它,每次创建该类的新实例时都会调用它。

class Fish:
    def __init__(self):
        self.weight = 3
    def swim(self):
        print "I'm swimming!"
    def breathe(self):
        print "I'm breathing!"

您为类定义的每个函数都有一个隐含参数,我们通常将其标记为self。第一个参数始终设置为调用函数的实例。例如,如果我调用

f = Fish()
f.swim()

Python 创建一个Fish,将其放入f,然后在其上调用Fish.__init__(f)Fish.swim(f)。在这种情况下,f 中的 Fish 将其权重设置为 3,并导致“我在游泳!”打印出来。

您可以创建不需要使用self 参数的类函数,称为静态函数,但这些函数仅适用于您可能暂时不会遇到的特定情况。 Python 中的类函数通常是实例函数,它会隐式接受self 参数。

请注意,在上面的示例中,每个 Fish 创建的默认权重设置为 3。如果我们想在创建时指定 Fish 的权重怎么办?好吧,我们可以定义__init__() 来接受一些额外的参数:

class SuperFish:
    def __init__(self, weight = 3):
        self.weight = weight

请注意,weight 参数的默认值定义为 3。因此,我们实际上可以选择指定权重。如果我们只是说def __init__(self, weight):,则需要指定权重。

我们现在可以执行以下任一调用:

a = SuperFish() # creates a SuperFish with a weight of 3
b = SuperFish(42) # creates a SuperFish with a weight of 42
c = SuperFish(weight = 9001) # creates a SuperFish with a weight of 9001

希望能为你解决问题:)

【讨论】:

【参考方案3】:

self 指的是对象本身,__init__ 是一个构造函数,初始化那个“self”的字段。 例如,您正在创建一个包含字段“name”和“age”的 Person 类。在__init__ 中,您可以通过以下方式将默认名称设置为“Bob”并将年龄设置为 36:

def __init__(self):
    self._name = "Bob"
    self._age = 36

这样,每次创建新的 Person 对象时,默认姓名和年龄都会设置为“Bob”和 36。

【讨论】:

【参考方案4】:

__init__(self) 是在所谓的“类”中使用的特殊函数。 Classes 让您定义自己的数据类型/对象,并且在您创建已定义的数据类型/对象的新实例时调用此 __init__ 函数。这就像说“嘿,每次你做这些事情时,确保你也运行这个代码”。在面向对象编程中,我们称这种函数为“构造函数”。这是一个用于“构造”新对象的函数。 self 是对实际创建的对象的引用。换句话说,在您使用__init__ 函数时,该对象在技术上已经创建。 __init__ 只是让您有机会初始化对象的各个方面(因此得名 __init__)。

Python 是函数式、过程式和面向对象范式的混合体。这个__init__ 业务与对象有关。有关面向对象编程的更多信息,您可以查看wikipedia article。

【讨论】:

很好的解释,对 OOP 新手很有帮助【参考方案5】:

__init__ 是 Python 中一个类的 constructor。类中被__ 括起来的方法具有特殊含义(构造、运算符实现等)。

【讨论】:

从技术上讲,它不是构造函数。 技术差异在实践中通常并不重要,除非您正在处理高级 Python 技术,例如元类,大多数程序员都不会接触。 Initialiser 也许...__new__ 将是构造函数。 __new__ 也不完全是一个构造函数,更多的是类实例本身的 malloc/reference 查找系统,具体取决于你用它做什么......对我来说,它看起来像 __new____init__ 都做传统构造函数的部分工作,但也做该工作之外的事情。似乎最好通过说 __new__ 创建和/或检索实例引用来避免整个问题,而 __init__ 填充实例的初始状态。

以上是关于Python 新手:有人知道 __init__(self) 做啥吗? (请简单解释!)[重复]的主要内容,如果未能解决你的问题,请参考以下文章

python __init__() 需要 1 个位置参数,但有 2 个是新手

__init__(self) 在 Python 中是啥意思? [复制]

Python:总是使用 __new__ 而不是 __init__?

Python cx_Freeze __init__“没有名为编解码器的模块”

python:how does subclass call baseclass's __init__()

Python Pygame 无法正确显示图像