我见过的大多数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
。
答案 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 ()中进行一行赋值。