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类中定义构造函数,以初始化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

你可能感兴趣的:(python,开发语言)