【问题标题】:How to retrieve attributes?如何检索属性?
【发布时间】:2020-09-11 22:30:25
【问题描述】:
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__ 函数中检索属性。

【问题讨论】:

  • 属性在添加之前不存在。 __init__ 方法无法知道您要在类中使用哪些属性。
  • 不能动态访问参数变量,除非使用eval()
  • 还可以考虑重构类,这样它就不必拥有所有这些参数,因此必须在你的类中设置更少的变量。
  • 将 kwargs 风格的 dict 传递给 init(),而不是单独的参数。这样你就可以遍历字典并提取变量名。
  • @Barmar setattr(self,'parameter',value) 将动态创建一个实例变量。

标签: python python-3.x class attr


【解决方案1】:

我建议为此使用dataclasses。在您的情况下,您只需添加:

from dataclasses import dataclass

@dataclass
class personalized:
    name: str
    age: int
    height: int
    width: int
    hair_color: str
    eye_color: str

这将自动为您构建一个具有自分配属性的 init

【讨论】:

    【解决方案2】:

    您可以使用__set__(..) 函数 (https://docs.python.org/3/howto/descriptor.html),但我不建议这样做,因为:

    • 从可读性的角度来看,这将难以长期维护(代码的阅读频率高于编写频率)
    • 每次您想要访问此类条目时,您首先必须检查描述符/属性是否可用,从而使您的后续代码变得更糟。 看: How to know if an object has an attribute in Python

    【讨论】:

      【解决方案3】:

      使用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
      

      【讨论】:

        猜你喜欢
        • 2011-06-07
        • 2023-03-10
        • 1970-01-01
        • 2011-08-03
        • 1970-01-01
        • 2021-10-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多