【问题标题】:python For loop for class attributes?python For循环用于类属性?
【发布时间】:2019-02-24 20:06:18
【问题描述】:

如果该参数不等于None,是否可以使用类中的参数循环函数?我知道如何使用很多 if 循环来做到这一点,但我还有其他方法可以做到这一点吗?

这是我想做的一个例子:

class Name:
    def __init__(self,name,favfood,favcolour,favsport):
        self.name = name
        self.favfood = favfood
        self.favcolour = favcolour
        self.favsport = favsport

henry = Name("Henry","Sushi","Blue",None)

我想要一个能打印出他所有喜欢的东西的函数,但如果它是 None 则会跳过它,几乎是一个用于类的 for 循环。

有没有办法为类中的每个属性设置一个 forloop?

【问题讨论】:

  • https://stackoverflow.com/questions/6886493/get-all-object-attributes-in-python

标签: python class


【解决方案1】:

您可以使用self 对象的__dict__ 属性:

class Name:
    def __init__(self,name,favfood,favcolour,favsport):
        self.name = name
        self.favfood = favfood
        self.favcolour = favcolour
        self.favsport = favsport
        for key, value in self.__dict__.items():
            if value is not None:
                print('%s: %s' % (key, value))

henry = Name("Henry","Sushi","Blue",None)

这个输出:

name: Henry
favfood: Sushi
favcolour: Blue

【讨论】:

  • 有没有办法将键变量用作属性?例如,我可以用 henry.key 调用属性
  • 唯一的问题是不是所有的对象都有__dict__属性...当一个类定义了__slots__属性时,它的对象没有__dict__
【解决方案2】:

*Updated 将使用@blhsing 建议的__dict__ 属性

class Name:
    def __init__(self,name,favfood,favcolour,favsport):
        self.name = name
        self.favfood = favfood
        self.favcolour = favcolour
        self.favsport = favsport

    def print_favs(self):
        '''even better using @blh method'''
        [print(f'{k}: {v}') for k, v in self.__dict__.items() if v != None]



henry = Name("Henry","Sushi","Blue",None)
henry.print_favs()
(xenial)vash@localhost:~/python/stack_overflow$ python3.7 helping.py 
name: Henry
favfood: Sushi
favcolour: Blue

【讨论】:

  • 不要。 self.lista 包含属性的原始值。如果属性接收到新值,self.lista 将保持不变。
猜你喜欢
  • 2011-01-16
  • 1970-01-01
  • 1970-01-01
  • 2021-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多