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
的其他基本特性,例如它有多重。
原则上,如果我有一个名为f
的Fish
,我可以这样做
f.weight = 3
但是,如果我忘记对某些 Fish
执行此操作,例如命名为 g
的 Fish
,然后尝试在表达式中使用 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__“没有名为编解码器的模块”