Python 构造函数怎么用?

文章导读
Previous Quiz Next Python 中的 constructor 是 class 中的一个 instance method,每当创建 class 的新对象时都会自动调用。构造函数的作用是在对象声明后立即为 instance variables 赋值。
📋 目录
  1. A 在 Python 中创建构造函数
  2. B Python 中的构造函数类型
  3. C Python 中的 Default Constructor
  4. D Parameterized Constructor
  5. E Python - 实例方法
  6. F Python 多构造函数
A A

Python - 构造函数



Previous
Quiz
Next

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