2013-04-26 20 views
1

類我定義兩個類,如下所示:連接的方法的一類,而正在創建

class ClassModel(object): 
    pass 

class FunctionModel(object): 
    attr = None 
    def __call__(self): 
     return self.attr 

的想法是要創建的ClassModel幾個拷貝,每一個都包含零個或多個方法繼承FunctionModel,應該有每一個屬於自己的屬性。

我很喜歡創造ClassModelFunctionModel的孩子。但是我沒有成功地附加這兩個,所以當ClassModel的孩子被實例化時,來自FunctionModel的類似功能的對象已經被附加到它們,被Python識別爲它們的方法。

看看會發生什麼

>>> func = type('func', (FunctionModel,), {'attr': 'someattr'}) 
>>> func_inst = func() 
>>> func_inst 
<__main__.func object at 0x968e4ac> 
>>> Cls = type('Cls', (ClassModel,), {'func_inst': func_inst}) 
>>> cls_inst = Cls() 
>>> cls_inst.func_inst 
<__main__.func object at 0x968e4ac> 

我怎麼能去嗎?

+0

我不知道我理解。這與預期行爲有什麼不同? – 2013-04-26 09:30:41

+0

我在''func_inst'是一個自治函數,而不是'cls_inst'的方法,類已經被創建。 – michaelmeyer 2013-04-26 09:52:00

回答

0

我終於想出瞭如何做到這一點。在創建新的類對象之後添加類方法(這不完全是我想要的),但在它實際上是實例化之前添加的。方法的名稱可以動態改變,歸功於setattr

class ClassModel(object): 
    number = None 

class FunctionModel(object): 
    number = None 
    def __call__(myself, clsself): 
     return myself.number + clsself.number 

定義類,並將其添加屬性:

from types import MethodType 

func1 = type('func1', (FunctionModel,), {'number': 3}) 
func2 = type('func2', (FunctionModel,), {'number': 5}) 
func1_inst = func1() 
func2_inst = func2() 

Cls = type('Cls', (ClassModel,), {'number': 10}) 
setattr(Cls, 'func1', MethodType(func1_inst, Cls)) 
setattr(Cls, 'func2', MethodType(func2_inst, Cls)) 

而且實例化它:

cls_inst = Cls() 
cls_inst.func1() 
# 13 
cls_inst.func2() 
# 15 
0

我在這裏可能是完全錯誤的,但肯定你只想FunctionModel成爲ClassModel的父類?

class FunctionModel(object): 
    attr = None 
    def __call__(self): 
     return self.attr 

class ClassModel(FunctionModel): 
    pass 

現在ClassModel將有FunctionModel所有屬性但壓倒一切的東西要小心了。對於ClassModel創建__init__方法時,你可以確保你打電話FunctionModel小號__init__太與Python類和繼承here一個super()

class ClassModel(FunctionModel): 

    def __init__(self, extra_args): 
     super(ClassModel, self).__init__() 

     self.extra_args = extra_args 

更多信息。

2

考慮使用元類, 這裏一個例子:

class ClassModel(object): 
    attr = None 

class FunctionModel(object): 
    attr = None 
    def __init__(self,aValue): 
     self.attr = aValue 
    def __call__(self, cls): 
     return self.attr + cls.attr 

def getFMClasses(aDictOfMethods): 
    class MM(type): 
     def __new__(cls, name, bases, dct):  
      for aName in aDictOfMethods: 
       dct[aName] = classmethod(FunctionModel(aDictOfMethods[aName])) 
      return super(MM, cls).__new__(cls, name, bases, dct) 
     pass              
    pass               
    return MM             

一旦所有的定義,獲得新班級是一個兒童遊戲...

class NewClass1(ClassModel): 
    __metaclass__ = getFMClasses({'method1':3,'method2':5}) 
    attr = 2 

class NewClass2(ClassModel): 
    __metaclass__ = getFMClasses({'method1':6,'DifferentMethod':2,'OneMore':0}) 
    attr = 3 

myObj = NewClass1() 
print myObj.method1() 
print myObj.method2() 
myObj = NewClass2() 
print myObj.method1() 
print myObj.DifferentMethod() 
print myObj.OneMore() 
+0

這不會使'NewClass1'的方法'method1'等等 – michaelmeyer 2013-04-26 11:37:26

+0

然後我編輯了相關部分,我用dct [aName]替換了dct [aName] = FunctionModel(aDictOfMethods [aName]), = classmethod(FunctionModel(aDictOfMethods [aName])) – jimifiki 2013-04-26 12:25:06

相關問題