天天看點

python動态添加、删除屬性和方法的兩種不同模式

在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