是否有可能将class .__ init __()的所有输入作为一行的属性?

时间:2019-07-10 21:45:14

标签: python class attributes

我见过的大多数Python类如下(从本教程开始):

class Person:

    def __init__(self, name, surname, birthdate, address, telephone, email):
        self.name = name
        self.surname = surname
        self.birthdate = birthdate

        self.address = address
        self.telephone = telephone
        self.email = email

有没有一种方法可以将所有输入作为属性 init ,而不必一次一行地输入它们?

这不仅用于数据存储,而且该类还有其他方法。

我喜欢这样:

class A:
    def __init__(self, name, surname, birthdate, address, telephone, email):
        for name, value in kwargs.items():
            setattr(self, name, value)

因此,该类无法使用任何随机变量启动,但是我没有为每个项目键入self.item = item

2 个答案:

答案 0 :(得分:2)

对于位置参数,您可以执行类似的操作

class A:
    def __init__(self, *args):
        names = ('attr_name_1', 'attr_name_2', ..., 'attr_name_n')
        for name, value in zip(names, args):
            setattr(self, name, value)

如果要确保在此处获取所需的值数量,可以选中len(args) == len(names)

使用关键字参数只是

class A:
    def __init__(self, **kwargs):
        for name, value in kwargs.items():
            setattr(self, name, value)

同样,如果要检查参数是否为期望的参数,可以将期望的键存储在一组中(例如names)并选中names == set(kwargs.keys())

无论如何,如果要使用类来基本上存储该数据,则可以使用dataclasses。取自官方的Python3.7文档:

@dataclass
class InventoryItem:
    '''Class for keeping track of an item in inventory.'''
    name: str
    unit_price: float
    quantity_on_hand: int = 0

    def total_cost(self) -> float:
        return self.unit_price * self.quantity_on_hand

请注意,对于较早的Python版本,dataclasses不是Python标准库的一部分,但可以作为常规软件包(例如pip install dataclasses)安装

答案 1 :(得分:0)

这似乎是一个选择(虽然可能不是最Python化的方式):

class A:
    def __init__(self, name, surname):
        for item in inspect.signature(A).parameters:
            setattr(self, item, eval(item))

使用上述方法,在启动课程时必须提供名称和姓氏,但是我不需要一次在 init ()中进行一行赋值。