在创建类时将方法附加到类

2024-10-01 07:10:17 发布

您现在位置:Python中文网/ 问答频道 /正文

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

class ClassModel(object):
    pass

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

其思想是创建ClassModel的几个副本,每个副本包含从FunctionModel继承的零个或多个方法,每个方法都应该有自己的属性。你知道吗

我可以创建ClassModelFunctionModel的子级。但是我没有成功地附加这两个对象,因此当ClassModel的子对象被实例化时,Python会将从FunctionModel派生的类函数对象识别为它们的方法。你知道吗

看看会发生什么

>>> 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>

我怎么能接受这个?你知道吗


Tags: 对象方法selfobjectmaintype副本at
3条回答

考虑使用元类, 举个例子:

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()

我在这里可能完全错了,但您肯定只希望FunctionModel成为ClassModel的父类?你知道吗

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

class ClassModel(FunctionModel):
    pass

现在ClassModel将拥有FunctionModel的所有属性,但要小心过度使用的东西。为ClassModel创建__init__方法时,可以确保也使用super()调用FunctionModels__init__

class ClassModel(FunctionModel):

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

        self.extra_args = extra_args

有关python类和继承here的更多信息。你知道吗

我终于想出办法了。类方法是在创建新的类对象之后添加的(这并不是我想要的),而是在它实际实例化之前添加的。由于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

相关问题 更多 >