在Python中,我們可以在運作時動态地添加或删除類和執行個體的屬性和方法
1、動态添加屬性和方法
1.1 動态添加屬性和方法:直接給執行個體或類指派。在上面的例子中,我們通過p1.email = '[email protected]'來動态添加了執行個體屬性。而通過Professor.department = 'Computer Science'來動态添加了類屬性。
class Professor:
def __init__(self, name, age, field):
self.name = name
self.age = age
self.field = field
def introduce(self):
print(f"My name is {self.name}, I'm {self.age} years old, and my research field is {self.field}.")
# 建立執行個體
p1 = Professor('John', 45, 'Artificial Intelligence')
# 添加執行個體屬性
p1.email = '[email protected]'
print(p1.email) # 輸出:[email protected]
# 添加執行個體方法
def research_interest(self):
print(f"My research interests are in the field of {self.field}.")
p1.research_interest = research_interest
p1.research_interest() # 輸出:My research interests are in the field of Artificial Intelligence.
# 添加類屬性
Professor.department = 'Computer Science'
print(Professor.department) # 輸出:Computer Science
# 添加類方法
@classmethod
def change_department(cls, new_department):
cls.department = new_department
Professor.change_department = change_department
print(Professor.department) # 輸出:Computer Science
Professor.change_department('Engineering')
print(Professor.department) # 輸出:Engineering
1.2使用内置函數setattr()。内置函數setattr()可以用來動态地向一個對象添加屬性或方法。
setattr(obj, name, value)
其中,obj是要添加屬性或方法的對象,name是要添加的屬性或方法的名稱,value是屬性或方法的值。
class Professor:
def __init__(self, name, field):
self.name = name
self.field = field
professor = Professor('John', 'Computer Science')
# 動态添加屬性
setattr(professor, 'age', 45)
print(professor.age) # 輸出 45
# 動态添加方法
def greet(self):
print(f'Hello, my name is {self.name} and I am a professor of {self.field}.')
setattr(professor, 'greet', greet)
professor.greet() # 輸出 "Hello, my name is John and I am a professor of Computer Science."
建立了一個教授的執行個體professor,然後使用setattr()函數向它添加了一個名為age的屬性和一個名為greet的方法。greet方法的定義中包含一個參數self,它表示方法的調用者,也就是教授執行個體本身。我們可以将self看作是一個占位符,當我們調用greet方法時,Python會自動将調用者作為第一個參數傳入方法中。
2、動态删除屬性和方法:動态删除屬性和方法同樣也有兩種方式:一種是使用del語句,另一種是使用内置函數delattr()。
# 删除執行個體屬性
del p1.email
print(hasattr(p1, 'email')) # 輸出:False
# 删除執行個體方法
del p1.research_interest
print(hasattr(p1, 'research_interest')) # 輸出:False
# 删除類屬性
del Professor.department
print(hasattr(Professor, 'department')) # 輸出:False
# 删除類方法
del Professor.change_department
print(hasattr(Professor, 'change_department')) # 輸出:False