天天看点

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