Python 构造器是类中的一个实例方法,每当创建该类的新对象时会自动调用。构造函数的角色是在对象声明后立即赋予实例变量值。
Python 使用一种名为 init() 的特殊方法,在该对象声明后立即初始化实例变量。
在 Python 中创建构造函数
init()方法作为构造子。它需要一个名为 self 的必备参数,即对对象的引用。
python
def __init__(self, parameters):
#initialize instance variables
init()方法以及类中的任何实例方法都有一个必备参数,即 self。不过,你可以给第一个参数起任何名字,不一定是自参数。
Python 中的构造函数类型
Python 有两种类型的构造子 −
- 默认构造器
- 参数化构造器
Python 中的默认构造函数
仅接受 self 参数的 Python 构造函数被称为默认构造函数。
示例
让我们在 Employee 类中定义构造子,将名称和年龄初始化为实例变量。然后我们可以通过其对象访问这些属性。
python
class Employee:
'Common base class for all employees'
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 类,我们声明的每个对象的实例变量名称和年龄值都相同。要声明属性变化的对象而非默认值,请定义 init() 方法的参数。
参数化构造器
如果构造函数定义了多个参数,并且 self 称为参数化构造器。
示例
在这个例子中,init()构造器有两个形式参数。我们声明具有不同值的员工对象 −
python
class Employee:
'Common base class for all employees'
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
你也可以在构造函数中为形式参数赋予默认值,这样对象可以带或不传递参数来实例化。
python
class Employee:
'Common base class for all employees'
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 对象的名称和年龄属性。
python
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
你可以随时添加、删除或修改类和对象的属性 -
python
# Add a 'salary' attribute
emp1.salary = 7000
# Modify 'name' attribute
emp1.name = 'xyz'
# Delete 'salary' attribute
del emp1.salary
你可以使用以下函数 −
-
getattr(obj, name[, default]) − 用于访问对象的属性。
-
hasattr(obj,name) − 用于检查属性是否存在。
-
setattr(obj,name,value) − 用于设置属性。如果不存在属性,则该属性被创建。
-
delattr(obj,名称)− 用于删除属性。
python
# Returns true if 'salary' attribute exists
print (hasattr(e1, 'salary'))
# Returns value of 'name' attribute
print (getattr(e1, 'name'))
# Set attribute 'salary' at 8
setattr(e1, 'salary', 7000)
# Delete attribute 'age'
delattr(e1, 'age')
它将产生以下输出 −
False
Bhavana
Python多构造函数
如前所述,我们定义了 init() 方法来创建构造函数。然而,与 C++ 和 Java 等其他编程语言不同,Python 不允许使用多个构造函数。
如果你尝试创建多个构造函数,Python 不会抛出错误,但它只考虑你类中最后一个 init() 方法。它之前的定义会被最后一个覆盖。
但 Python 也有类似功能。我们可以根据传递给 init() 方法的参数类型或数量来超载构造函数。这将允许单个构造器方法根据所提供的参数处理各种初始化场景。
示例
以下示例展示了如何实现类似多构造函数的功能。
python
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")
当我们运行上述代码时,输出如下 −
Name: Shrey
Name: Ram and Age: 25
Name: Shyam, Age: 26 and Gender: M