Python中如何实现基于已有对象创建继承其类的新类并复用属性?
实现继承类并通过已有父类实例创建新实例的方法
当然可以实现这种需求,核心是在子类的初始化方法里把父类实例的属性复制过来,再添加子类自己的属性和方法。因为子类本身继承了父类,所以父类的方法会自动拥有,不需要额外处理。下面是两种常见的实现方式:
方式一:利用__dict__复制动态属性
如果父类没有使用__slots__限制属性,可以直接通过__dict__批量复制父类实例的所有属性:
class A: def __init__(self, x): self.x = x def say_hello(self): print(f"Hello from A, x is {self.x}") class B(A): def __init__(self, a_obj, y): # 把A实例的所有属性复制到当前B实例 self.__dict__.update(a_obj.__dict__) # 添加B独有的属性 self.y = y # 添加B独有的方法 def say_goodbye(self): print(f"Goodbye from B, y is {self.y}, x is {self.x}") # 测试代码 a = A(10) a.extra_attr = 20 # 给A实例动态添加额外属性 b = B(a, 30) # 验证属性和方法 print(b.x) # 输出:10(继承自a的属性) print(b.extra_attr) # 输出:20(继承自a的动态属性) b.say_hello() # 调用A的方法,输出:Hello from A, x is 10 b.say_goodbye() # 调用B的方法,输出:Goodbye from B, y is 30, x is 10
方式二:处理使用__slots__的父类
如果父类用了__slots__来限制属性,__dict__不会存在,这时候需要手动遍历__slots__里的属性进行复制:
class A: __slots__ = ('x', 'extra_attr') def __init__(self, x): self.x = x def say_hello(self): print(f"Hello from A, x is {self.x}") class B(A): # 合并父类和子类的slots __slots__ = ('y',) + A.__slots__ def __init__(self, a_obj, y): # 遍历复制父类slots中的所有属性 for slot in A.__slots__: setattr(self, slot, getattr(a_obj, slot)) # 添加子类独有的属性 self.y = y def say_goodbye(self): print(f"Goodbye from B, y is {self.y}, x is {self.x}") # 测试代码 a = A(10) a.extra_attr = 20 b = B(a, 30) print(b.x) # 输出:10 print(b.extra_attr) # 输出:20 b.say_hello() # 输出:Hello from A, x is 10 b.say_goodbye() # 输出:Goodbye from B, y is 30, x is 10
这两种方式都能让B实例完全继承A实例的属性和父类的方法,同时拥有自己的扩展内容,完全符合你的需求。
内容的提问来源于stack exchange,提问作者BenyaminGhN
相关产品推荐
相关产品推荐

