2016-08-02 52 views
0

下面是一些代碼入手:如何動態地創建在Python一類的初始化

def objectify(name, fields): 
    """ Create a new object including the __init__() method. """ 
    def __init__(self, *argv): 
     for name, val in zip(var_names, argv): 
      setattr(self, name, val) 

    # The following line of code is currently limited to a single dynamic class. 
    # We would like to extend it to allow creating multiple classes 
    # and each class should remember it's own fields. 
    __init__.var_names = fields 

    result = type(name, (object,), dict(__init__=__init__)) 

這裏的挑戰是找到一種方法,使具有每個類的__init__()方法的獨特副本它的變量名稱的靜態列表。

B計劃: 我們可以使用eval()來運行函數生成的代碼。但要儘可能避免使用eval()。這裏面臨的挑戰是在沒有eval()的情況下這樣做。

編輯:雖然寫了這個問題,我想出了一個解決方案。 (見下文)也許這會幫助別人。

編輯2:我會用這個函數來創建類似namedtuple()的東西,除了它們是可變的。

Point = objectify('point', ['x', 'y']) 
a = Point(1, 2) 
b = Point(2, 3) 
print a.__dict__ 
print b.__dict__ 

回答

0

這裏是一個解決方案:

def objectify(obj_name, fields): 
    """ Create a new object including the __init__() method. """ 

    def __init__(self, *argv): 
     """ Generic initializer for dynamically created classes. """ 
     fields = objectify.fields[self.__class__.__name__] 
     for field, val in zip(fields, argv): 
      setattr(self, field, val) 

    result = type(obj_name, (object,), dict()) 
    result.__init__ = __init__ 

    # Save the list of fields in a static dictionary that is retrieved by class name. 
    objectify.fields[obj_name] = fields 

    return result 

objectify.fields = {}   # A static local variable. 
3

你沒有後來提及關於字段的用法什麼。如果你只需要他們__init__,你並不需要保存在所有:

def objectify(name, fields): 
    """ Create a new object including the __init__() method. """ 
    fields = fields[:] 
    def __init__(self, *argv): 
     for name, val in zip(fields, argv): 
      setattr(self, name, val) 

    result = type(name, (object,), dict(__init__=__init__)) 
    return result 

否則,你應該看看元類 - 這正是他們的用例。

更新:製作副本fields確保更改調用方中的列表不會影響存儲的列表。值仍然可以改變...留給練習讀者來驗證一切是str

+0

我加了'EDIT2'來解釋你將如何使用這個函數;有點像一個可變的'namedtuple()'。 – ChaimG

+0

這工作得很好我的解決方案。無需額外的存儲。 – viraptor

+0

我驗證了你的解決方案,你是對的!我很好奇爲什麼這個工程。 – ChaimG

相關問題