对类

时间:2015-11-28 17:16:00

标签: python class iteration

我理解如何基于从Web中剔除的示例创建一个不复杂的类,但是当我尝试访问其上的成员时,我碰到了一个问题:

让我们说这是我的班级:

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的方法,该方法将遍历该类的所有现有成员,并使用其属性打印所有成员,即使属性也是如此是可变的(超过最初定义的de)。我认为这被称为"重载" 但我不确定适当的术语。

3 个答案:

答案 0 :(得分:2)

您正在寻找的术语是type introspectionOverloading是完全不同的,您提供方法的不同实现。

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

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

答案 1 :(得分:1)

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

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)

答案 2 :(得分:1)

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

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)