在Python中处理许多参数/类属性

1959年

我正在创建一个Python类,它将使用其参数来定义该类中的另外两个类。例如,ClassAcontainsClassBClassC因此,ClassA具有许多参数。

我目前正在使用**kwargsforclassBclassCarguments解决此问题,并仅保存参数的输入classA参数。例如:

class A:
    def __init__(self, a1, a2, a3, **kwargs):
        self.a1 = a1
        self.a2 = a2
        self.a3 = a3

        # Get B and C kwargs
        default_params = {
            'b1': kwargs.get('b1', 1),
            'b2': kwargs.get('b1', 2),
            'c1': kwargs.get('c1', 1),
            'c2': kwargs.get('c1', 2),          
        }
        for param in default_params:
            self.__dict__[param] = default_params[param]

        B = classB(a1=self.a1, b1=self.b1, b2=self.b2)
        C = classC(a2=self.a2, c1=self.c1, c2=self.c2)

与下面的方法相比,这是更糟糕的解决方案吗?

class A:
    def __init__(
        self,
        a1, a2, a3,
        b1, b2, c1, c2):
        self.a1 = a1
        self.a2 = a2
        self.a3 = a3
        self.b1 = b1
        self.b2 = b2
        self.c1 = c1
        self.c2 = c2

我担心的是,如果类B和C的参数过多,那么类A的属性似乎太多了。另一方面,第一种方法似乎仍然占用更多的行。

另一种方法是,如果我仅将kwargs传递给classBclassC,但是当其中一个类中不存在某些参数时,这将出现错误。

对于具有许多属性的类并利用这种设计模式,我在这里看不到pythonic的方法吗?

宫城先生

您的主要标准应该是避免模仿Python本身提供的功能-即参数和默认值以及实例属性。

由于__init__已经知道所有属性和期望的默认值(通过default_params),因此可以将它们直接添加到签名中。避免存放论据classBclassCA-如果需要的话,从实例中获取它们。

class A:
    # handle parameters/defaults natively
    def __init__(self, a1, a2, a3, b1=1, b2=2, c1=1, c2=2):
        self.a1 = a1
        self.a2 = a2
        self.a3 = a3
        # do not store B/C attributes, store B/C directly
        self.b = classB(a1=self.a1, b1=b1, b2=b2)
        self.c = classC(a2=self.a2, c1=c1, c2=c2)

这在功能上等同于第一种情况(减去所有参数),但是使用了本机Python功能。


如果A必须提供其他功能,请显式添加它们:

  • 如果A应采用(并忽略)其他参数,则应具有一个附加的包罗万象**kwargs

    class A:
        # discard additional parameters/defaults explicitly
        def __init__(self, a1, a2, a3, b1=1, b2=2, c1=1, c2=2, **_):
            ...
    
  • 如果A应公开classB和/或classC提供字段,请从实例中提供它们。

    class A:
        ...
    
        @property
        def b1(self):
            return self.b.b1
    

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在python中如何处理可变的类属性

来自分类Dev

在Python中调用类属性

来自分类Dev

Python 中类方法的长参数列表:本地、参数还是类属性?

来自分类Dev

Python:使用类来处理方法调用,就好像类属性是方法参数一样

来自分类Dev

Python:使用类来处理方法调用,就好像类属性是方法参数一样

来自分类Dev

在Python中列出类属性及其类型

来自分类Dev

Python类中的类属性阴影

来自分类Dev

在Python中命名常量类属性

来自分类Dev

Python类中的类属性阴影

来自分类Dev

在python中创建和调用类属性

来自分类Dev

Python:类方法参数和类属性的名称相同

来自分类Dev

昂首阔步:从参数示例值中删除类属性

来自分类Dev

将C#类属性作为方法中的参数传递

来自分类Dev

Python类属性错误

来自分类Dev

Python静态类属性

来自分类Dev

在Python中为类属性创建“标准属性”

来自分类Dev

如何在Python中修改实例属性而不是类属性

来自分类Dev

Python:DEAP:以编程方式处理许多func参数

来自分类Dev

类属性中的属性错误

来自分类Dev

如何从 Python 中的类中访问类属性

来自分类Dev

Python,使用类属性或函数中变量的速度更快?

来自分类Dev

Python中的线程:类属性(列表)不是线程安全的吗?

来自分类Dev

在python单元测试中模拟类属性的更好方法

来自分类Dev

在Python 2.7中使用变量引用类属性

来自分类Dev

以与Python中声明的顺序相同的顺序读取类属性

来自分类Dev

如何在Python的Decorator中访问类属性?

来自分类Dev

python类属性在函数中更新时未更新

来自分类Dev

如何在Python Mockito中模拟类属性

来自分类Dev

如何禁止在Python中创建新的类属性?

Related 相关文章

热门标签

归档