问题描述
class character():
class personalized:
def __init__(self,name,age,height,width,hair_color,eye_color):
# I want to do this
for attr in personalized:
personalized.attr = attr
#instead of this
personalized.name = name
personalized.age = age
personalized.height = height
如果我使用具有很多属性的类,我不想每次都将其设置为等于变量,因为它会占用大量空间。有没有办法像我上面写的那样写,但确实有效。本质上,我不知道如何从__init__
函数中检索属性。
解决方法
我建议为此使用dataclasses。对于您的情况,您只需添加:
from dataclasses import dataclass
@dataclass
class personalized:
name: str
age: int
height: int
width: int
hair_color: str
eye_color: str
这将为您自动构造具有自定义属性的 init
,您可以使用__set__(..)
函数(https://docs.python.org/3/howto/descriptor.html),但我不建议这样做,因为:
- 从可读性的角度来看,从长远来看,这将变得更加难以维护(代码的读取和编写频率更高)
- 每次您要访问此类条目时,首先必须检查描述符/属性是否可用,从而使您的后续代码更糟。 看到: How to know if an object has an attribute in Python
使用vars()
和setattr()
可以完成您想要的操作,但是如果使用Python 3.7+,我建议使用dataclasses和其他答案一样。
vars()
返回一个局部变量字典。 __init__
字典的顶部包含self
和任何参数作为键及其值。
setattr()
将在对象上设置属性值。
class Personalized:
def __init__(self,name,age,height,width,hair_color,eye_color):
for key,value in vars().items():
if key != 'self':
setattr(self,key,value)
p = Personalized('name',5,10,12,'black','blue')
print(p.name,p.age,p.height,p.width,p.hair_color,p.eye_color)
输出:
name 5 10 12 black blue