带有多个参数的对象初始化
有一个更好的方法吗?
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