Clean和DRY方式在Python中扩展Object

时间:2013-12-27 19:31:27

标签: python class object design-patterns multiple-inheritance

我基本上陷入了对象属性继承和扩展基类方法的双重问题。

我正在重构我的代码以遵循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(),也需要重写整个函数

对此有优雅的解决方案吗?

1 个答案:

答案 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