【发布时间】:2012-07-25 07:28:48
【问题描述】:
谁能解释__init__(self) 的作用?我一直在阅读其他问题和提到超级课程的人?什么是超级班?我认为程序应该从
def print_word(word):
print word
__init__(self) 是某种特殊情况,因为它有下划线和“自我”吗?抱歉缺少具体的术语……仍在学习中。
【问题讨论】:
谁能解释__init__(self) 的作用?我一直在阅读其他问题和提到超级课程的人?什么是超级班?我认为程序应该从
def print_word(word):
print word
__init__(self) 是某种特殊情况,因为它有下划线和“自我”吗?抱歉缺少具体的术语……仍在学习中。
【问题讨论】:
可能重复: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 中下划线的含义。
超类:
【讨论】:
要了解__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
希望能为你解决问题:)
【讨论】:
self 指的是对象本身,__init__ 是一个构造函数,初始化那个“self”的字段。
例如,您正在创建一个包含字段“name”和“age”的 Person 类。在__init__ 中,您可以通过以下方式将默认名称设置为“Bob”并将年龄设置为 36:
def __init__(self):
self._name = "Bob"
self._age = 36
这样,每次创建新的 Person 对象时,默认姓名和年龄都会设置为“Bob”和 36。
【讨论】:
__init__(self) 是在所谓的“类”中使用的特殊函数。 Classes 让您定义自己的数据类型/对象,并且在您创建已定义的数据类型/对象的新实例时调用此 __init__ 函数。这就像说“嘿,每次你做这些事情时,确保你也运行这个代码”。在面向对象编程中,我们称这种函数为“构造函数”。这是一个用于“构造”新对象的函数。 self 是对实际创建的对象的引用。换句话说,在您使用__init__ 函数时,该对象在技术上已经创建。 __init__ 只是让您有机会初始化对象的各个方面(因此得名 __init__)。
Python 是函数式、过程式和面向对象范式的混合体。这个__init__ 业务与对象有关。有关面向对象编程的更多信息,您可以查看wikipedia article。
【讨论】:
__init__ 是 Python 中一个类的 constructor。类中被__ 括起来的方法具有特殊含义(构造、运算符实现等)。
【讨论】:
__new__ 将是构造函数。
__new__ 也不完全是一个构造函数,更多的是类实例本身的 malloc/reference 查找系统,具体取决于你用它做什么......对我来说,它看起来像 __new__和__init__ 都做传统构造函数的部分工作,但也做该工作之外的事情。似乎最好通过说 __new__ 创建和/或检索实例引用来避免整个问题,而 __init__ 填充实例的初始状态。