Python - 建構函式



Python 的建構函式是類中的一個例項方法,每當建立類的新的物件時,都會自動呼叫它。建構函式的作用是在宣告物件後立即為例項變數賦值。

Python 使用一個名為__init__()的特殊方法來初始化物件的例項變數,一旦物件被宣告。

在 Python 中建立建構函式

__init__()方法充當建構函式。它需要一個名為self的必填引數,它是物件的引用。

def __init__(self, parameters):
#initialize instance variables

__init__()方法以及類中的任何例項方法都必須有一個引數self。但是,您可以為第一個引數命名,不一定是 self。

Python 中建構函式的型別

Python 有兩種型別的建構函式:

  • 預設建構函式
  • 引數化建構函式

Python 中的預設建構函式

除了self之外不接受任何其他引數的 Python 建構函式稱為預設建構函式。

示例

讓我們在 Employee 類中定義建構函式來初始化 name 和 age 作為例項變數。然後,我們可以透過其物件訪問這些屬性。

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 類,我們宣告的每個物件其例項變數 name 和 age 將具有相同的值。為了宣告具有不同屬性而不是預設屬性的物件,請為 __init__() 方法定義引數。

引數化建構函式

如果建構函式與self一起定義了多個引數,則稱為引數化建構函式。

示例

在這個例子中,__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))

它將產生以下輸出

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))

它將產生以下輸出

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

您可以隨時新增、刪除或修改類和物件的屬性:

# 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, name) - 刪除屬性。

# 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__()`方法的引數型別或數量來過載建構函式。這將允許單個建構函式方法根據提供的引數處理各種初始化場景。

示例

以下示例演示瞭如何實現類似於多個建構函式的功能。

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
廣告