我理解如何基于从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)。我认为这被称为"重载"
但我不确定适当的术语。
答案 0 :(得分:2)
您正在寻找的术语是type introspection。 Overloading是完全不同的,您提供方法的不同实现。
您可以使用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)