什么是在Python中初始化具有许多可选属性的类的建议方法

时间:2018-01-28 11:20:04

标签: python

我是Python的新手,我正在寻找一种编写具有许多可选属性的类的方法,可以在单个代码行中初始化。

到目前为止,我发现的是 init 方法的可选参数方法,可以按名称分配:

class MyClass():
    def __init__(self, param1=None, param2=None, param3=None, param4=None):
        self.param1 = param1
        self.param2 = param2
        self.param3 = param3
        self.param4 = param4

并初始化 可以看起来像:

o1 = MyClass(param2="someVal", param4="someOtherVal")

这种方法似乎很好,而且我认为像IntelliJ这样的IDE将能够以这种方式提供一些代码完成。

但是,我想知道这是否是正确的方法,以防我创建一个复杂的类层次结构。假设MyClass将继承MyBaseClass和MyOtherClass,我希望通过MyClass的init方法(或其他方式?)初始化所有类中的所有属性。

实现这一目标的最佳方法是什么,希望还能帮助IDE提供代码完成功能?

感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

在构造函数中有如此多可选参数的类可能是一个"代码气味"并且重新设计是有序的。我建议写一些参数组类:

class ParamSetA:
    def __init__(param2="someVal", param4="someOtherVal"):
    self.param2 = param2
    self.param4 = param4

class ParamSetB:
    def __init__(param3, param4):
    self.param3 = param3
    self.param4 = param4

class MyClass():
    def __init__(self, params):
        self.params = params

现在很明显如何将参数传递给其他相关类:只需传递封装一组有效参数的整个对象。

这也使验证更容易:使用无意义的参数集(例如,互斥参数或相关参数)构造MyClass更加困难。

答案 1 :(得分:0)

这个怎么样?

inspect.getargspec()

参考:Get a list/tuple/dict of the arguments passed to a function? - 您可能还需要使用{{1}}。