如何检索属性?

问题描述

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

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...