在 Python 中使用自定义参数列表进行类 init,如果未显式传递参数,请设置默认值

Class init in Python with custom list of parameters, set default if parameters is not explicitly passed

提问人:Triceratops 提问时间:12/21/2022 最后编辑:Triceratops 更新时间:12/21/2022 访问量:59

问:

我想在 Python 3.9 中定义一个类,该类将字典或参数列表作为参数获取,并在以下事项中设置类属性:

  1. 如果在参数中传递了键名,则它使用它来设置相应的类属性。
  2. 如果未传递键名,则使用默认值设置类属性。

一种方法是:

class example():
   def __init__(self, x=None, y=None):
       if x is None:
          self.x = "default_x"
       else:
          self.x = x
       if y is None:
          self.y = "default_y"
       else:
          self.y = y

或很快(感谢 Matszwecja):

class example():
   def __init__(self, x="default_x", y="default_y"):
      self.x = x
      self.y = y

有没有一种更 Python 的方法可以在不对每个参数进行硬编码的情况下做到这一点?我想要一些灵活性,这样如果我将来添加另一个属性,我就不需要为另一个属性进行硬编码。if

我想声明一个类

class example():
   def __init__(kwargs):
     ?

比如如果我通过它就会生成example(y="some", z=1, w=2)

self.x = "default_x"
self.y = "some"
self.z = 1
self.w = 2
python-3.x 参数传递

评论

0赞 matszwecja 12/21/2022
x = 'default_x'而不是?从字面上看,这就是默认的用途。x=None
0赞 Triceratops 12/21/2022
是的,但我希望我可以以动态方式传递参数,因此我不需要在标头中指定整个参数列表。
1赞 matszwecja 12/21/2022
我不明白这如何改变任何事情。您已经在做同样的事情,只是出于某种原因将其设置为而不是您想要的实际默认值。None
0赞 Triceratops 12/21/2022
这就是我现在的做法。有没有一种自动方法可以从参数中生成列表?self.x
1赞 matszwecja 12/21/2022
像这样的东西?pythontutorial.net/python-oop/python-dataclass

答:

1赞 matszwecja 12/21/2022 #1
class example():
    def __init__(self, x="default_x", y="default_y"):
        self.x = x
        self.y = y
0赞 chepner #2

请考虑使用数据类为您生成样板方法。__init__

from dataclasses import dataclass


@dataclass
class Example:
    x: str = "default_x"
    y: str = "default_y"

如果需要提供可变的默认值(例如,如果没有提供显式列表,则为新的空列表),则可以使用显式创建具有默认工厂的字段;装饰器使用该对象为 instance 属性生成必要的代码。dataclasses.fielddataclassField

from dataclasses import dataclass, field


@dataclass
class Example:
    x: str = "default_x"
    # Bad!
    # y: list[str] = []
    y: list[str] = field(default_factory=list)  # Good