1

我定义了两个类,如下所示:

class ClassModel(object):
    pass

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

这个想法是创建多个副本ClassModel,每个副本包含零个或多个继承自的方法,每个副本FunctionModel都应该有自己的属性。

我很适合创建ClassModeland的孩子FunctionModel。但是我没有成功地附加这两者,以便在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>

我该怎么办?

4

3 回答 3

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()
于 2013-04-26T10:20:53.747 回答
0

我在这里可能完全错了,但你肯定只是想FunctionModel成为的父类ClassModel吗?

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

class ClassModel(FunctionModel):
    pass

现在ClassModel将具有的所有属性,FunctionModel但要小心压倒一切的东西。在为您创建__init__方法时,ClassModel可以确保您也使用FunctionModels调用__init__super()

class ClassModel(FunctionModel):

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

        self.extra_args = extra_args

有关 python 类和继承的更多信息在这里

于 2013-04-26T09:26:48.957 回答
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
于 2013-04-26T10:06:13.517 回答