Python __init__() 语法
__init__() 是 Python 的一个特殊方法(又称 “魔法方法” 或 “双下划线方法”),它在创建类的新实例时自动调用。__init__() 的主要作用是:用于初始化新创建的实例的属性。
语法:
class MyObject:
def __init__(self, arg1, arg2, ..., argN):
self.attr1 = arg1
self.attr2 = arg2
……
说明:
__init__() 方法接收以下 2 种参数。
self(必选):约定俗成的名称,代表新创建的实例对象。这是 __init__() 接收的第一个参数,并且是自动传递的。arg1, arg2, ..., argN(可选):在创建实例时传递给构造函数的其他参数。这些参数通常用于初始化实例的属性。
__init__() 方法是 Python 中类的构造器。它不返回任何值(隐式返回 None),其目的是设置新创建的实例的初始状态。
注意:
- __init__() 不是真正的 “构造函数”,因为它不负责创建对象本身,而是负责初始化对象。对象的创建是在 __new__() 方法中完成的。
- 如果类中没有定义 __init__() 方法,那么 Python 会提供一个默认的 __init__() 方法,该方法不执行任何操作。
- __init__() 方法在类实例被创建时(比如通过 MyObject(…) 调用)自动被调用。
Python __init__() 摘要
| 属于 | Python 魔法方法 |
|---|---|
| 使用频率 | 高 |
| 官方文档 | 查看 |
| 相关方法 | __new__() |
Python __init__() 示例
接下来,我们通过几个简单的例子来讲解一下 Python __init__() 方法是如何使用的。
示例 1:__init__() 初始化实例属性
# 定义类
class Hero():
def __init__(self, name, type):
self.name = name
self.type = type
def skill(self):
print('开始放大招啦!')
# 实例化第 1 个对象
h1 = Hero('船长', '力量型')
print(f'name: {h1.name}, type: {h1.type}')
# 实例化第 2 个对象
h2 = Hero('先知', '智力型')
print(f'name: {h2.name}, type: {h2.type}')
运行结果如下。
name: 船长 , type: 力量型
name: 先知 , type: 智力型
分析:
在这个例子中,我们使用构造函数 __init__() 来为每一个对象初始化两个属性:name 和 type。在 __init__() 中,self 指向的是当前实例化的对象。例如执行 h1 = Hero('船长', '力量型') 之后,self 指向的是 h1 这个对象,而执行 h2 = Hero('先知', '智力型') 之后,self 指向的是 h2 这个对象。
示例 2:__init__() 带有可选参数和默认值
class Student:
def __init__(self, name, age, major='计算机科学'):
self.name = name
self.age = age
self.major = major
def get_info(self):
return f'姓名: {self.name}, 年龄: {self.age}, 专业: {self.major}'
# 使用默认专业
s1 = Student('小明', 20)
print(s1.get_info())
# 使用所有参数
s2 = Student('小红', 22, '软件工程')
print(s2.get_info())
运行结果如下。
姓名: 小明, 年龄: 20, 专业: 计算机科学
姓名: 小红, 年龄: 22, 专业: 软件工程
分析:
__init__() 方法可以像普通函数一样,也可以定义可选参数和默认值,这使得创建实例时更加灵活。我们可以根据实际需要,来提供或省略某些参数。
如果小伙伴们对 Python 函数的各种参数(如位置参数、关键字参数等)不熟悉的话,可以查看:Python 函数参数。
示例 3:__init__() 与继承(调用父类的 __init__())
class Animal:
def __init__(self, name):
self.name = name
def speak(self):
pass # 留待子类实现
class Dog(Animal):
def __init__(self, name, breed):
super().__init__(name) # 调用父类的 __init__ 方法
self.breed = breed
def speak(self):
print(f'{self.name}:汪汪叫!')
# 创建 Dog 实例
my_dog = Dog('大黄', '中华田园犬')
print(f'名字:{my_dog.name}, 品种:{my_dog.breed}')
my_dog.speak()
运行结果如下。
名字:大黄, 品种:中华田园犬
大黄:汪汪叫!
分析:
在 Dog 类的 __init__() 方法中,super().__init__(name) 被用来调用 Animal(父类)的 __init__() 方法,这样可以确保 name 属性在 Animal 级别被正确初始化。然后,我们再在 Dog 类中初始化自身的 breed 属性。
示例 4:没有显式定义 __init__() 方法
class SimpleClass:
# 没有显式定义 __init__ 方法
pass
obj = SimpleClass() # 仍然可以创建实例
print(type(obj))
运行结果如下。
<class '__main__.SimpleClass'>
分析:
即使没有显式定义 __init__() 方法,也可以创建类的实例。不过在这种情况下,Python 会使用默认的 __init__() 方法。此时该方法不接收任何参数,也不进行任何初始化。
如果你尝试在没有 __init__() 的类中创建带参数的实例,Python 就会抛出 TypeError 异常。
