如何在Python中实现“参数对象”重构?
现在我使用参数对象的类来进行继承,像这样:
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中,使用这种设计模式可能并不是最好的选择。