python - 是否可以将 class.__init__() 的所有输入都作为一行中的属性?

标签 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

最佳答案

对于位置参数你可以做类似的事情

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.键())

无论如何,如果您想使用您的类来基本存储该数据,您可以使用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)

关于python - 是否可以将 class.__init__() 的所有输入都作为一行中的属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56979052/

相关文章:

python - 为什么这两个 Python unicode 字符串不同?

java - 创建 "new object"和 "Class objectname"之间的区别

.net - 用自定义类 .NET Winforms 替换现有控件

button - 如何在 Material-UI 中的 <Button>/<ButtonBase> 上添加 HTML 属性?

python - 理解 Dask 分布式的内存行为

python - 字符串列表的总和引发 TypeError

PHP:getAttribute() 所有属性

python - 创建具有默认值 Python 属性的对象

python - 如何使用networkX在有向加权图中检测社区?

java - 在 switch 语句中调用类?