从类中获取/循环变量树

时间:2014-02-19 09:44:52

标签: python python-2.x

我如何从python中的对象获取所有变量的列表?

实施例: 一个对象是从一个类生成的,该类可以(但不是必须,它是各种各样的,类是一个黑盒子,直到现在我只能通过小费来检测变量。并检查弹出选择菜单)这种形式的变量: / p>

obj.Background.Picture.Embedded  
obj.Background.Picture.Path  
obj.Background.Picture.Style 
obj.Background.Picture.Visible
# ......
obj.DisplaySettings.DisplayFormat.Source.Dec.DisplaySign
obj.DisplaySettings.DisplayFormat.Source.Dec.Format
obj.DisplaySettings.DisplayFormat.Source.Dec.Precision
obj.DisplaySettings.DisplayFormat.Source.Dec.UsePrecision
# ......
obj.UniqueID
# .....

该对象也可能具有以下功能:

Obj.MoveDown()
Obj.MoveUp()
# .....
Obj.Active()
Obj.Remove()

我怎么能得到像这样的字符串格式的列表?

VarList = ['obj.Background.Picture.Embedded', ... , 'Obj.DisplaySettings.DisplayFormat.Source.Dec.DisplaySign', ... , 'obj.UniqueID']

目的是将一些变量从obj复制到obj。像:

Obj1.DisplaySettings.DisplayFormat.Source.Dec.DisplaySign = obj2.DisplaySettings.DisplayFormat.Source.Dec.DisplaySign

由于某种原因,不应复制像UniqueID这样的变量。因此无法使用复制库。

2 个答案:

答案 0 :(得分:4)

您可以使用vars() function直接在对象上列出所有实例属性;它返回一个字典:

 >>> vars(Obj)
 {'Background': <BackgroundType at 0x...>, 'DisplaySettings': <...>, ...}

或者您可以使用dir(),它会在实例及其父级(类,基类,它们的基类等)上返回名称的列表

>>> dir(Obj)
['__module__', '__name__', 'Active', 'Background', ...]

对象上的许多属性都是更复杂的对象,并且具有自己的属性。然后,您将检查Background对象,例如:

>>> dir(Obj.Background)
[ ..., 'Picture', ...]

要复制属性,我会坚持使用vars()和循环来过滤:

dec1 = Obj1.DisplaySettings.DisplayFormat.Source.Dec
dec2 = Obj2.DisplaySettings.DisplayFormat.Source.Dec
for name, value in vars(dec1).items():
    if name not in ('UniqueID', ...):
        setattr(dec2, name, value)

将复制未复制的名字元组中未列出的任何名称。

答案 1 :(得分:0)

你可以使用:

dir(obj)

为您提供对象的所有成员变量/函数。