我基本上陷入了对象属性继承和扩展基类方法的双重问题。
我正在重构我的代码以遵循DRY规则并讨论最佳设计解决方案。
是否有一种简短而优雅的方法来制作和对象从基类继承属性并扩展其现有方法
,不映射对象B中对象A的每个属性 * 没有一堆装饰器和属性? *
似乎不允许访问基类对象的属性
示例:
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装饰器,我想
方法1不能轻易扩展,也不允许你访问self.x,也不允许你通过method1extended转换为self.y总是指出最初的self.y值
即使您尝试使用super(),也需要重写整个函数
对此有优雅的解决方案吗?
答案 0 :(得分:3)
使用以下代码尝试。
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()
我们改变了一系列事项:
A
添加了object
个子类以获得新式类。 (请注意,这仅适用于python版本2)object.__init__
中添加了对A.__init__
的调用。 Python不会为你隐式调用这些,你必须自己动手。B.__init__
现在拨打A.__init__
。这也需要你做。B.method1extended
重命名为B.method1
,以便隐藏A.method1
。B.method1
在应用自己的更改之前调用A.method1
。