如何在Python中实现“参数对象”重构?

4 投票
3 回答
874 浏览
提问于 2025-04-15 17:35

现在我使用参数对象的类来进行继承,像这样:

class A():
    def __init__(self,p1,p2):
        self.p1, self.p2 = p1, p2

class B(A):
    def __init__(self,b):
        self.p1, self.p2 = b.p1, b.p2

这样做可以避免使用代码时不使用类代码本身的荒谬情况。所以,我想像C++那样,把参数对象传递到初始化列表中,像这样:

class A { 
    int p1,p2; 
}
class B : public A { 
    B(const A& a) : A(a) {} 
}

我可以在Python中这样做吗?具体来说,我能否通过在子类的__init__中调用父类的__init__来设置父类的属性?根据我在《Dive into Python》中的阅读,我猜我可以这样做,因为在调用__init__时,对象已经被构造好了。

或者,也许在Python中有其他不同的方法来实现参数对象重构(而我只是试图强行使用C++的技巧)?

3 个回答

1
class B(A):
    def __init__(self, *args, **kwargs):
        super(B, self).__init__(*args, **kwargs)

想了解更多关于 super() 的信息,可以去看看这个链接。

2

把C++代码转换成Python的样子大概是这样的:

class A():
    def __init__(self,p1,p2):
        self.p1, self.p2 = p1, p2

class B(A):
    def __init__(self,b):
        A.__init__(self, b.p1, b.p2)
3

一般来说,你可能不需要使用参数对象重构这种技术。Python的标准库里已经有好几个集合,它们提供了参数对象重构所带来的核心好处。

另外,像参数对象设计模式这样的重构在成本和收益分析上,与C++有很大的不同。例如,在没有静态编译的情况下,创建对象和查找成员的成本会高很多。参数对象模式的基本目的是为相关字段提供一个命名空间,而在Python中,使用字典就能简单地实现这一点。

如果你需要对一组数据进行某种模型操作,比如与这些数据相关的方法,那么在Python中使用这种模式会更有价值。但即便如此,像“属性”这样的简单且成本低的机制也能满足对成员属性的操作需求。

如果我们能更详细地描述一下问题的背景,或许能帮助你评估这种重构是否有好处,但在Python中,使用这种设计模式可能并不是最好的选择。

撰写回答