在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