2012-02-05 36 views
3

我有一個有點難以解釋的問題。我有一個由多個類的模塊:someModule.py使用反射窺視模塊及其類

#imports over here 
class Default(Base): 
def __init__(self): 
    a = Rectangle() #all these guys derive from Shape 
    b = Circle() 
    c = Sphere() 

class Foo: 
#members over here 

#other classes/functions/whatever we can define here, except the boiler plate code to check __main__ 

我想要做的就是創建從一個特定的基類(如基地)在運行時導出類的一個對象,操作從另一個特定基類(例如Shape)派生的數據成員。含義我想寫一個這樣的腳本,它需要模塊名稱並執行上述任務。任何想法如何我可以做這個使用檢查或別的東西?我已經看過檢查,但沒有找到完成工作的方法。我可能會錯過一些東西。

回答

1

沒有辦法知道里面有什麼__init__創建實例之前。

只能後加以制止,而做到這一點的一種方式是vars()

defy = Default() 
for name,value in vars(defy).items(): 
    if isinstance(value, Shape): 
     # manipulate 

要做到以上所有的someModule.py那也都是Base子類:

import someModule 

instances = [] 
for cls_name,cls in vars(someModule): 
    if issubclass(cls, Base): 
     obj = cls() 
     for name,value in vars(cls).items(): 
      if isinstance(value, Shape): 
       # manipulate 
     instances.append(obj) 

相反,如果你想操縱其Shape子類將被實例化,你就必須讓他們類屬性,例如:

class Default(Base): 
    default_shapes = [Rectangle, Circle, Sphere] 
    def __init__(self): 
     self.shapes = [shape() for shape in self.__class__.default_shapes] 
0

這裏有一種方法:確保你的基類(例如Base,Shape)是新樣式類(它們繼承自object)。通過這樣做,您可以使用內置的__subclasses__()函數來獲取所有派生類的列表。然後,你可以簡單地創建一個對象,並經過領域,他們與你感興趣的課程比較。

baseDerived = Base.__subclasses__() 
shapeDerived = Shape.__subclasses__() 

# Iterate through derived classes 
for derivedClass in baseDerived: 
    derivedObject = derivedClass() 

    # Iterate through data attributes 
    for attr, dataMember in derivedObject.__dict__.iteritems(): 
     if dataMember.__class__ in shapeDerived: 
      # Do stuff with the data member here