Python - 构造函数
Python 中的 constructor 是 class 中的一个 instance method,每当创建 class 的新对象时都会自动调用。构造函数的作用是在对象声明后立即为 instance variables 赋值。
Python 使用一个特殊的 method 名为 __init__() 来初始化对象的 instance variables,一旦对象声明就会立即执行。
在 Python 中创建构造函数
__init__() method 充当构造函数。它需要一个强制参数名为 self,这是对对象的引用。
def __init__(self, parameters): #初始化 instance variables
__init__() method 以及 class 中的任何 instance method 都有一个强制参数 self。不过,你可以为第一个参数使用任何名称,不一定是 self。
Python 中的构造函数类型
Python 有两种类型的构造函数 −
- Default Constructor
- Parameterized Constructor
Python 中的 Default Constructor
Python 构造函数除了 self 外不接受任何其他参数的称为 default constructor。
示例
让我们在 Employee class 中定义 constructor,以 name 和 age 作为 instance variables 初始化。然后,我们可以通过其对象访问这些属性。
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))
它将产生以下 output −
Name: Bhavana age: 24
对于上面的 Employee class,我们声明的每个对象,其 instance variables name 和 age 都会具有相同的值。为了声明具有不同属性而不是默认值的对象,请为 __init__() method 定义参数。
Parameterized Constructor
如果构造函数与 self 一起定义了多个参数,则称为 parameterized constructor。
示例
在这个示例中,__init__() 构造函数有两个形式参数。我们用不同的值声明 Employee 对象 −
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))
它将产生以下 output −
Name: Bhavana age: 24 Name: Bharat age: 25
你也可以为构造函数中的形式参数分配默认值,这样对象可以在传递参数或不传递参数的情况下实例化。
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))
它将产生以下 output −
Name: Bhavana age: 24 Name: Bharat age: 25
Python - 实例方法
除了 __init__() 构造函数外,一个 class 中可能还定义了一个或多个 instance methods。以 self 作为形式参数之一的方法称为 instance method,因为它是由特定对象调用的。
示例
在下面的示例中,定义了一个 displayEmployee() 方法作为 instance method。它返回调用该方法的 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()
它将产生以下 output −
Name : Bhavana , age: 24 Name : Bharat , age: 25
你可以随时添加、删除或修改 class 和对象的属性 −
# 添加 'salary' 属性 emp1.salary = 7000 # 修改 'name' 属性 emp1.name = 'xyz' # 删除 'salary' 属性 del emp1.salary
除了使用普通语句访问属性外,你还可以使用以下函数 −
getattr(obj, name[, default]) − 用于访问对象的属性。
hasattr(obj,name) − 用于检查属性是否存在。
setattr(obj,name,value) − 用于设置属性。如果属性不存在,则会创建它。
delattr(obj, name) − 用于删除属性。
# 如果 'salary' 属性存在则返回 True print (hasattr(e1, 'salary')) # 返回 'name' 属性的值 print (getattr(e1, 'name')) # 将 'salary' 属性设置为 7000 setattr(e1, 'salary', 7000) # 删除 'age' 属性 delattr(e1, 'age')
它将产生以下 output −
False Bhavana
Python 多构造函数
如前所述,我们定义 __init__() 方法来创建构造函数。然而,与 C++ 和 Java 等其他编程语言不同,Python 不允许多个构造函数。
如果你尝试创建多个构造函数,Python 不会抛出错误,但它只会考虑 class 中最后一个 __init__() 方法。先前的定义将被最后一个覆盖。
但是,在 Python 中有一种方法可以实现类似功能。我们可以根据传递给 __init__() 方法的参数类型或数量来 overload 构造函数。这将允许单个构造函数方法根据提供的参数处理各种初始化场景。
示例
以下示例展示了如何实现类似于多个构造函数的功能。
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}")
当我们运行上述代码时,它将产生以下 output −
Name: Shrey Name: Ram and Age: 25 Name: Shyam, Age: 26 and Gender: M