构造函数是在类中定义的一个实例方法,在每次创建新对象时会自动调用。构造函数的作用是在对象声明后立即为实例变量分配值。
Python 使用一个特殊的方法 __init__()
来初始化对象声明时的实例变量。
在 Python 中创建构造函数
__init__()
方法充当构造函数。它需要一个名为 self
的强制参数,这是对象的引用。
def __init__(self, 参数):
__init__()
方法以及类中的任何实例方法都有一个强制参数 self
。但是,你可以为第一个参数取任何名字,不一定非得是 self
。
Python 中构造函数的类型
Python 中有两种类型的构造函数:
Python 中的默认构造函数
Python 中不接受除 self
之外的任何参数的构造函数被称为默认构造函数。
示例
让我们定义 Employee
类中的构造函数来初始化 name
和 age
作为实例变量。然后我们可以通过其对象来访问这些属性。
class Employee:
'所有员工的基础类'
def __init__(self):
self.name = "Bhavana"
self.age = 24
e1 = Employee()
print("Name: {}".format(e1.name))
print("age: {}".format(e1.age))
这将产生如下输出:
Name: Bhavana
age: 24
对于上面的 Employee
类,我们声明的每个对象都将具有相同的 name
和 age
实例变量值。为了声明具有不同属性的对象而不是默认值,需要为 __init__()
方法定义参数。
带参数的构造函数
如果构造函数定义了多个参数以及 self
,则称为带参数的构造函数。
示例
在这个例子中,__init__()
构造函数有两个形式参数。我们可以声明具有不同值的 Employee
对象。
class Employee:
'所有员工的基础类'
def __init__(self, name, age):
self.name = name
self.age = age
e1 = Employee("Bhavana", 24)
e2 = Employee("Bharat", 25)
print("Name: {}".format(e1.name))
print("age: {}".format(e1.age))
print("Name: {}".format(e2.name))
print("age: {}".format(e2.age))
这将产生如下输出:
Name: Bhavana
age: 24
Name: Bharat
age: 25
你也可以为构造函数中的形式参数分配默认值,这样就可以在传递或不传递参数的情况下实例化对象。
class Employee:
'所有员工的基础类'
def __init__(self, name="Bhavana", age=24):
self.name = name
self.age = age
e1 = Employee()
e2 = Employee("Bharat", 25)
print("Name: {}".format(e1.name))
print("age: {}".format(e1.age))
print("Name: {}".format(e2.name))
print("age: {}".format(e2.age))
这将产生如下输出:
Name: Bhavana
age: 24
Name: Bharat
age: 25
Python - 实例方法
除了 __init__()
构造函数外,类中还可以定义一个或多个实例方法。一个将 self
作为形式参数之一的方法被称为实例方法,因为它是由特定对象调用的。
示例
在下面的例子中定义了一个 displayEmployee()
方法作为实例方法。它返回调用该方法的 Employee
对象的 name
和 age
属性。
class Employee:
def __init__(self, name="Bhavana", age=24):
self.name = name
self.age = age
def displayEmployee(self):
print("Name : ", self.name, ", age: ", self.age)
e1 = Employee()
e2 = Employee("Bharat", 25)
e1.displayEmployee()
e2.displayEmployee()
这将产生如下输出:
Name : Bhavana , age: 24
Name : Bharat , age: 25
你可以随时添加、移除或修改类和对象的属性 ——
emp1.salary = 7000
emp1.name = 'xyz'
del emp1.salary
代替使用正常的语句来访问属性,你可以使用以下函数:
-
getattr(obj, name[, default])
—— 用来访问对象的属性。
-
hasattr(obj, name)
—— 用来检查对象是否包含有对应的属性。
-
setattr(obj, name, value)
—— 用来设置一个属性值。如果属性不存在,则会被创建。
-
delattr(obj, name)
—— 用来删除一个属性。
print(hasattr(e1, 'salary'))
print(getattr(e1, 'name'))
setattr(e1, 'salary', 7000)
delattr(e1, 'age')
这将产生如下输出:
False
Bhavana
Python 多个构造函数
如前所述,我们定义 __init__()
方法来创建构造函数。然而,与 C++ 和 Java 等其他编程语言不同的是,Python 不允许定义多个构造函数。
如果你尝试定义多个构造函数,Python 不会抛出错误,但它只会考虑类中的最后一个 __init__()
方法。其之前的定义将被最后一个覆盖。
但是,有一种方法可以在 Python 中实现类似的功能。我们可以根据传递给 __init__()
方法的参数类型或数量来重载构造函数。这将允许单个构造函数方法根据提供的参数处理各种初始化场景。
示例
下面的例子展示了如何实现类似于多个构造函数的功能。
class Student:
def __init__(self, *args):
if len(args) == 1:
self.name = args[0]
elif len(args) == 2:
self.name = args[0]
self.age = args[1]
elif len(args) == 3:
self.name = args[0]
self.age = args[1]
self.gender = args[2]
st1 = Student("Shrey")
print("Name:", st1.name)
st2 = Student("Ram", 25)
print(f"Name: {st2.name} and Age: {st2.age}")
st3 = Student("Shyam", 26, "M")
print(f"Name: {st3.name}, Age: {st3.age} and Gender: {st3.gender}")
当我们运行上述代码时,它将产生如下输出:
Name: Shrey
Name: Ram and Age: 25
Name: Shyam, Age: 26 and Gender: M