【问题标题】:Iteration on members and attributes on a Class对类的成员和属性进行迭代
【发布时间】:2015-11-28 17:16:00
【问题描述】:

我了解如何根据从网络上挑选的示例创建一个简单的类,但我在尝试访问其中的成员时碰壁了:

假设这是我的课:

class Fruit(object):
    def __init__(self, name, color, flavor):
        self.name = name
        self.color = color
        self.flavor = flavor
    def description(self):
        print('I am a %s %s and my taste is %s and I am %s' % self.color, self.name, self.flavor))

要创建我使用的对象:

lemon = Fruit('lemon', 'yellow', 'sour')

并为我使用的柠檬创建一个新属性:

lemon.peel = 'easy'

我想在类的内部(或外部)定义一个方法,该方法将被称为printall,它将遍历该类的所有现有成员并打印所有这些成员及其属性,即使属性是可变的(比最初定义的更多)。我认为这被称为“重载” 但我不确定正确的术语。

【问题讨论】:

  • 您的Fruit.description() 方法有语法错误;在self.color 之前缺少一个(
  • 您可以使用dir(),但我认为在这里使用__get__()__set__() 是有意义的。
  • 希望我正确理解了您的问题,但是您是否尝试将所有要迭代的项目放在类内的列表中,然后通过 for 循环遍历列表?编辑:哦,我猜我没有大声笑

标签: python class iteration


【解决方案1】:

您要查找的术语是type introspectionOverloading 是完全不同的东西,你提供不同的方法实现。

您可以使用var() function 访问所有实例属性;它返回一个字典,然后您可以迭代以打印您的变量:

def printall(self):
    for name, value in vars(self).items():
        print('self.{} = {!r}'.format(name, value))

【讨论】:

    【解决方案2】:

    如果您不确定,可以使用以下循环查找所有成员的详细信息

    import gc
    #garbage collector should do the trick
    #all the other code
    for obj in gc.get_objects():
        if isinstance(obj, Fruit):
            print "object name :",obj.name
            printall(obj)
    

    【讨论】:

    • 再次感谢@saamera sy!我正在使用您的代码以及来自 Martijn Peters 的代码。
    【解决方案3】:

    也许这就是你要找的,虽然 printall 方法不是类的一部分,但当你将对象传递给它时,它能够访问类,并且以下代码应该打印属性名称和值Fruits 类中的对象柠檬。

    def printall(lemon):
        for a in dir(lemon):
            if not a.startswith('__') :
                print a,":",getattr(lemon, a)
    
    
    #rest of the code
    lemon = Fruit('lemon', 'yellow', 'sour')
    lemon.peel = 'easy'
    printall(lemon)
    

    【讨论】:

    • Martijn Pieters 和 sameera.sy 提出的解决方案有效,但他们假设我知道我正在呼叫的成员的姓名,我想要一个“盲”呼叫,它会在我不知道的情况下迭代所有成员事先他们的名字。如果这不可能,这意味着我将不得不创建一个包含我在课堂上介绍的所有名称的列表。谢谢你们的帮助!
    • 嗨,Albert,检查新答案,您可以使用垃圾收集器进行盲测。
    猜你喜欢
    • 1970-01-01
    • 2014-09-03
    • 1970-01-01
    • 2012-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多