Clean and DRY way to extend an Object in Python
我基本上陷入了对象属性继承和扩展基类方法的双重问题。
我正在重构我的代码以遵循DRY规则并讨论最佳设计解决方案。
是否有一种简短而优雅的方法来创建和对象从Base类继承属性并扩展其现有方法
不映射对象B中对象A的每个属性
*没有一堆装饰和属性?*
似乎不允许访问基类对象的属性
例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | class A(): def __init__(self): self.x ="whatever" self.y="cumbersome" self.z ="idea" def method1(self): self.x = self.x.lower() class B(A): def __init__(self): self.a = 87 @method1 def method1extended(self): self.y =self.y.upper() |
- 第一个问题:
b = B()
b.y没有设置所以我们应该使用setter和getter装饰器
- 第二个问题
method1不能轻易扩展,也不允许你访问self.x,也不允许你通过method1extended转换self.y总是指出初始self.y值
即使你尝试使用super(),你也需要重写整个函数
有一个优雅的解决方案吗?
使用以下代码尝试它。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | class A(object): def __init__(self): self.x ="whatever" self.y="cumbersome" self.z ="idea" def method1(self): self.x = self.x.lower() class B(A): def __init__(self): super(B, self).__init__() self.a = 87 def method1(self): super(B, self).method1() self.y =self.y.upper() |
以及我们更改的事项列表:
-
我们从
object 添加了A 子类来获得一个新式的类。 (请注意,这仅适用于python版本2) -
我们在
A.__init__ 中添加了对object.__init__ 的调用。 Python不会为你隐式调用这些,你必须自己做。 -
B.__init__ 现在调用A.__init__ 。 这又需要你做。 -
B.method1extended 重命名为B.method1 ,使其阴影A.method1 。 -
B.method1 在应用自己的更改之前调用A.method1 。