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类中定义构造函数,以初始化nameage作为实例变量。然后我们可以通过它的对象来访问这些属性。

    class Person:
        def __init__(self):
            self.name = '张三'
            self.age = 20
    
    p1 = Person()
    print('年龄:{}'.format(p1.age))
    print('姓名:{}'.format(p1.name))
    

    输出:

    年龄:20
    姓名:张三
    

    对于上述Person类,我们声明的每个对象其实例变量nameage都会有相同的值。

    参数化构造函数(不给形式参数赋默认值)

    如果定义的构造函数除了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
    

    作者:听海边涛声

    物联沃分享整理
    物联沃-IOTWORD物联网 » python:构造函数

    发表回复