如何在不丢失继承类实例数据的前提下添加新方法?
保留已有实例数据的同时为类添加方法
你当前的问题在于:重新定义manager类后,已创建的manager1实例仍然属于第一次定义的空manager类,无法使用新添加的raise_wage方法。以下是三种可行的解决方式,无需重新创建实例即可保留原有数据并使用新方法:
方案一:直接给原类动态添加方法(推荐)
无需重新定义整个类,直接为已存在的manager类添加方法,这样所有已创建和后续创建的manager实例都能调用该方法。
class worker(): def __init__(self,name,wage,department): self.name=name self.wage=wage self.department=department def showtheknowledges(self): print("""name={} wage={} department={}""".format(self.name,self.wage,self.department)) def changethedepartment(self,new_department): self.department=new_department class manager(worker): pass manager1=manager("John Wood",3000,"IT") manager1.showtheknowledges() manager1.changethedepartment("marketing") manager1.showtheknowledges() # 直接给manager类添加raise_wage方法 def raise_wage(self, increase): self.wage += increase manager.raise_wage = raise_wage # 测试新方法 manager1.raise_wage(500) manager1.showtheknowledges()
方案二:修改实例的__class__属性指向新类
如果已经重新定义了manager类,可以将现有实例的__class__属性修改为新类,让实例继承新方法的同时保留原有数据。
class worker(): def __init__(self,name,wage,department): self.name=name self.wage=wage self.department=department def showtheknowledges(self): print("""name={} wage={} department={}""".format(self.name,self.wage,self.department)) def changethedepartment(self,new_department): self.department=new_department class manager(worker): pass manager1=manager("John Wood",3000,"IT") manager1.showtheknowledges() manager1.changethedepartment("marketing") manager1.showtheknowledges() # 重新定义包含raise_wage方法的manager类 class manager(worker): def raise_wage(self,increase): self.wage+=increase # 将manager1的类指向新定义的manager manager1.__class__ = manager # 测试新方法 manager1.raise_wage(500) manager1.showtheknowledges()
方案三:仅给单个实例绑定方法(仅适用于单个实例)
如果只需要让manager1拥有该方法,其他manager实例不需要,可以直接给该实例绑定方法:
class worker(): def __init__(self,name,wage,department): self.name=name self.wage=wage self.department=department def showtheknowledges(self): print("""name={} wage={} department={}""".format(self.name,self.wage,self.department)) def changethedepartment(self,new_department): self.department=new_department class manager(worker): pass manager1=manager("John Wood",3000,"IT") manager1.showtheknowledges() manager1.changethedepartment("marketing") manager1.showtheknowledges() # 定义方法并绑定到manager1 def raise_wage(self, increase): self.wage += increase import types manager1.raise_wage = types.MethodType(raise_wage, manager1) # 测试新方法 manager1.raise_wage(500) manager1.showtheknowledges()
方案推荐
优先选择方案一,该方式直接修改类本身,所有实例都能共享新方法,符合面向对象的设计逻辑,避免后续维护时出现实例方法不一致的问题。
内容的提问来源于stack exchange,提问作者Rixy
相关产品推荐
相关产品推荐

