带有多个参数的对象初始化

有一个更好的方法吗?

class MyClass:
    def __init__(self, my_var_1, my_var_2, my_var_3, my_var_4, my_var_5, my_var_6, my_var_7, my_var_8, my_var_9):
        self.my_var_1 = my_var_1
        self.my_var_2 = my_var_2
        self.my_var_3 = my_var_3
        self.my_var_4 = my_var_4
        self.my_var_5 = my_var_5
        self.my_var_6 = my_var_6
        self.my_var_7 = my_var_7
        self.my_var_8 = my_var_8
        self.my_var_9 = my_var_9

假设变量名称不遵循任何模式。

回答

如果该类的目的只是保存相关数据的集合(“普通旧数据类”),我会使用NamedTuple(不可变的)或dataclass(可变的):

from typing import NamedTuple

class MyClass(NamedTuple):
    my_var_1: the_type
    my_var_2: the_type
    my_var_3: the_type
    my_var_4: the_type
    my_var_5: the_type
    my_var_6: the_type
    my_var_7: the_type
    my_var_8: the_type
    my_var_9: the_type
    

或者

from dataclasses import dataclass

@dataclass
class MyClass:
    my_var_1: the_type
    my_var_2: the_type
    # Ignoring other fields for brevity, but they'd be written the same as above

the_type每个字段的类型在哪里。不幸的是,在这种情况下,Python 的语法需要类型提示。无论如何,类型提示是一个很好的做法,因为它们有助于减少在代码运行之前可以捕获的错误。如果你真的不想要类型,你可以使用旧的namedtuple语法:

from collections import namedtuple

MyClass = namedtuple("MyClass", ["my_var_1", "my_var_2", "my_var_3"])
obj = MyClass(1, 2, 3)
print(obj)
# Prints MyClass(my_var_1=1, my_var_2=2, my_var_3=3)

所有这些选项都将为您生成该初始化程序,以及其他功能,如 nice __str__/ __repr__methods。例如:

class MyClass(NamedTuple):
    my_var_1: int
    my_var_2: int
    my_var_3: int
    my_var_4: int
    my_var_5: int
    my_var_6: int
    my_var_7: int
    my_var_8: int
    my_var_9: int

obj = MyClass(1, 2, 3, 4, 5, 6, 7, 8, 9)
print(obj)
# Prints MyClass(my_var_1=1, my_var_2=2, my_var_3=3, my_var_4=4, my_var_5=5, my_var_6=6, my_var_7=7, my_var_8=8, my_var_9=9)

不需要手动初始化定义。


这两种类型的主要区别是dataclasses 可以修改,而NamedTuples 不能(很像普通元组):

# obj from above
print(obj.my_var_6)  # Prints 6

obj.my_var_6 = 5

Traceback (most recent call last):
  File "<input>", line 1, in <module>
AttributeError: can't set attribute


以上是带有多个参数的对象初始化的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>