分享

python动态添加、删除属性和方法的两种不同模式

 禁忌石 2023-04-19 发布于浙江

在Python中,我们可以在运行时动态地添加或删除类和实例的属性和方法

1、动态添加属性和方法

1.1 动态添加属性和方法:直接给实例或类赋值。在上面的例子中,我们通过p1.email = 'john@example.com'来动态添加了实例属性。而通过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 = 'john@example.com'print(p1.email) # 输出:john@example.com# 添加实例方法def research_interest(self): print(f'My research interests are in the field of {self.field}.')p1.research_interest = research_interestp1.research_interest() # 输出:My research interests are in the field of Artificial Intelligence.# 添加类属性Professor.department = 'Computer Science'print(Professor.department) # 输出:Computer Science# 添加类方法@classmethoddef change_department(cls, new_department): cls.department = new_departmentProfessor.change_department = change_departmentprint(Professor.department) # 输出:Computer ScienceProfessor.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 = fieldprofessor = 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.emailprint(hasattr(p1, 'email'))  # 输出:False# 删除实例方法del p1.research_interestprint(hasattr(p1, 'research_interest'))  # 输出:False# 删除类属性del Professor.departmentprint(hasattr(Professor, 'department'))  # 输出:False# 删除类方法del Professor.change_departmentprint(hasattr(Professor, 'change_department'))  # 输出:False

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多