栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

如何动态地从基类创建派生类

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

如何动态地从基类创建派生类

这一段代码使您可以使用动态名称和参数名称创建新的类。参数验证

__init__
只是不允许使用未知参数,如果您需要其他验证(例如类型),或者它们是必需的,则只需在其中添加逻辑即可:

class baseClass(object):    def __init__(self, classtype):        self._type = classtypedef ClassFactory(name, argnames, baseClass=baseClass):    def __init__(self, **kwargs):        for key, value in kwargs.items(): # here, the argnames variable is the one passed to the # ClassFactory call if key not in argnames:     raise TypeError("Argument %s not valid for %s"          % (key, self.__class__.__name__)) setattr(self, key, value)        baseClass.__init__(self, name[:-len("Class")])    newclass = type(name, (baseClass,),{"__init__": __init__})    return newclass

这样,例如:

>>> SpecialClass = ClassFactory("SpecialClass", "a b c".split())>>> s = SpecialClass(a=2)>>> s.a2>>> s2 = SpecialClass(d=3)Traceback (most recent call last):  File "<stdin>", line 1, in <module>  File "<stdin>", line 8, in __init__TypeError: Argument d not valid for SpecialClass

我看到您要求在命名范围中插入动态名称-现在, 在Python中不被认为是一种好习惯-您要么具有在编码时已知的变量名,要么在数据中拥有-
在运行时学习的名称更多”数据”而不是“变量”-

因此,您可以将您的类添加到字典中,然后从那里使用它们:

name = "SpecialClass"classes = {}classes[name] = ClassFactory(name, params)instance = classes[name](...)

而且,如果您的设计绝对需要将名称包含在范围内,请执行相同的操作,但使用

globals()

调用返回的字典而不是任意字典:

name = "SpecialClass"globals()[name] = ClassFactory(name, params)instance = SpecialClass(...)

(对于类工厂函数,确实有可能在调用者的全局范围内动态插入名称-
但这是更糟糕的做法,并且在Python实现之间不兼容。这样做的方法是获取调用者的执行框架,方法是通过sys._getframe(1)并在其

f_globals
属性的框架的全局字典中设置类名称。

更新,tl;博士: 这个答案已经很流行了,但仍然非常适合问题主体。关于如何 在Python中 “从基类动态创建派生类” 的一般答案
是一个简单的调用,即

type
传递新的类名,带有基类的元组和
__dict__
新类的主体,如下所示:

>>> new_class = type("NewClassName", (baseClass,), {"new_method": lambda self: ...})

更新
需要此 功能的 任何人都还应该检查莳萝项目-
它声称能够像腌制普通对象一样对类进行腌制和腌制,并且在我的一些测试中得到了证实。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/429238.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号