python:构造函数
Python 构造函数是类中的一个实例方法,每当创建该类的新对象时,它都会被自动调用。构造函数的作用是在对象被声明时立即为实例变量赋值。
Python使用一个特殊的方法__init__()
来初始化对象实例变量,该方法在对象被声明时立即调用。
创建构造函数
__init__()
方法充当构造函数。它需要一个强制性的参数,名为self
,这是对对象的引用,其格式为:
def __init__(self, 参数, 参数, ...):
# 初始化实例变量
__init__()
方法以及类中的任何实例方法都有一个强制性的参数self
。然而,你可以给第一个参数赋予任何名称,不一定非得是self
。
示例
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
p1 = Person('张三', 20)
print(p1.age)
print(p1.name)
输出:
20
张三
构造函数的类型
Python有两种类型的构造函数:
默认构造函数
不接受除self
外任何参数的Python构造函数称为默认构造函数。
示例
让我们在Person
类中定义构造函数,以初始化name
和age
作为实例变量。然后我们可以通过它的对象来访问这些属性。
class Person:
def __init__(self):
self.name = '张三'
self.age = 20
p1 = Person()
print('年龄:{}'.format(p1.age))
print('姓名:{}'.format(p1.name))
输出:
年龄:20
姓名:张三
对于上述Person
类,我们声明的每个对象其实例变量name
和age
都会有相同的值。
参数化构造函数(不给形式参数赋默认值)
如果定义的构造函数除了self
之外还有多个参数,则称为参数化构造函数。
示例
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
p1 = Person('张三', 20)
p2 = Person('李四', 22)
print('姓名:{}'.format(p1.name))
print('年龄:{}'.format(p1.age))
print('姓名:{}'.format(p2.name))
print('年龄:{}'.format(p2.age))
输出:
姓名:张三
年龄:20
姓名:李四
年龄:22
参数化构造函数(给形式参数赋默认值)
你也可以在构造函数中为形式参数赋予默认值,这样对象就可以在传递参数或不传递参数的情况下被实例化。
class Person:
def __init__(self, name='张三', age=20):
self.name = name
self.age = age
p1 = Person()
p2 = Person('李四', 22)
print('姓名:{}'.format(p1.name))
print('年龄:{}'.format(p1.age))
print('姓名:{}'.format(p2.name))
print('年龄:{}'.format(p2.age))
输出:
姓名:张三
年龄:20
姓名:李四
年龄:22
实例方法
除了__init__()
构造函数之外,一个类中可能还定义了一个或多个实例方法。一个方法如果以self
作为其中一个形式参数,则称为实例方法,因为它是由特定对象调用的。
示例
class Person:
def __init__(self, name='张三', age=20):
self.name = name
self.age = age
def display(self):
print('name: ', self.name, ', age: ', self.age)
p1 = Person()
p2 = Person('李四', 22)
p1.display()
p2.display()
输出:
name: 张三 , age: 20
name: 李四 , age: 22
增加、删除、修改类和对象的属性
你可以随时添加、删除或修改类和对象的属性。
示例
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
p1 = Person('李四', 22)
print('name: ', p1.name, ', age: ', p1.age)
# 增加一个salary属性
p1.salary = 28000
print('salary: ', p1.salary)
# 修改name属性的值
p1.name = '王五'
print('name: ', p1.name)
# 删除salary属性
del p1.salary
输出:
name: 李四 , age: 22
salary: 28000
name: 王五
通过python的内置函数增加、删除、修改类和对象的属性
除了使用常规语句来访问属性外,你还可以使用以下函数:
getattr(obj, name[, default])
– 用于访问对象的属性。hasattr(obj, name)
– 用于检查是否存在某个属性。setattr(obj, name, value)
– 用于设置一个属性。如果该属性不存在,则会创建它。delattr(obj, name)
– 用于删除一个属性。示例
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
p1 = Person('李四', 22)
# 增加一个salary属性
p1.salary = 18000
# 判断salary属性是否存在
print(hasattr(p1, 'salary'))
# 获得name属性的值
print(getattr(p1, 'name'))
# 设置salary属性的值
setattr(p1, 'salary', 250000)
print(getattr(p1, 'salary'))
# 删除age属性
delattr(p1, 'age')
# 判断age属性是否存在
print(hasattr(p1, 'age'))
输出:
True
李四
250000
False
多构造函数
如前所述,我们定义了__init__()
方法来创建一个构造函数。然而,与其他编程语言(如C++和Java)不同,Python不允许多个构造函数。
如果你试图创建多个构造函数,Python不会抛出错误,但只会考虑你类中的最后一个__init__()
方法。它之前的定义将被最后一个覆盖。
但是,在Python中有一种方法可以实现类似的功能。我们可以基于传递给__init__()
方法的参数类型或数量来重载构造函数。这将允许单个构造函数方法根据提供的参数来处理各种初始化情况。
示例:如果定义了多个构造函数,只会调用最后一个
下面示例中,定义了两个构造函数:
class Person:
def __int__(self):
print('调用了第1个__int__(self)')
def __init__(self):
print('调用了第2个__int__(self)')
Person()
输出:
调用了第2个__int__(self)
由输出可以可以看到,尽管定义了多个构造函数,但只会调用最后一个。
示例:实现类似多个构造函数的功能
class Person:
def __init__(self, *args):
print(f'位置参数args的内容为:{args}')
if len(args) == 1:
self.name = args[0]
elif len(args) == 2:
self.name = args[0]
self.age = args[1]
p1 = Person('张三')
print('name: ', p1.name)
p2 = Person('李四', 20)
print('name: ', p2.name, ', age: ', p2.age)
输出:
位置参数args的内容为:('张三',)
name: 张三
位置参数args的内容为:('李四', 20)
name: 李四 , age: 20
作者:听海边涛声