2014-02-19 87 views
1

我该如何从python中的对象获取所有变量的列表?从类中获取/循环变量树

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

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这样的变量。因此使用复制库是不可能的。

回答

0

你可以使用:

dir(obj) 

给你所有的成员变量/对象的功能。

+0

不,我只看到函数,但没有变量 – user3327364

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) 

这会复制名称元组中未列出的任何名称而不复制。

+0

谢谢!然而使用vars(obj)我得到结果{'_oleobj_':}。它有一些像clear()copy()等函数。 – user3327364

+0

@ user3327364:你需要参考你正在使用的任何OLE对象(或者包装库)的文档来看看如何处理这些对象。这里有Windows对象的代理对象,而不是普通的Python类。 –