关于类:在Python中扩展Object的Clean和DRY方式

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