从函数中动态创建的类继承

时间:2014-04-16 15:41:27

标签: python oop metaprogramming

由于我正在处理的特定模块的奇怪性,我想知道是否有一种通用的方法让一个类继承在方法中本地创建的另一个类的属性。例如,以下内容:

def DefForm():
    class F(object):
        foo = bar

    return F

class MyClass(DefForm):
    pass

m = myClass()
m.foo
>>> 'bar'

2 个答案:

答案 0 :(得分:4)

从函数的返回值继承您的类,而不是函数本身:

class MyClass(DefForm()):
     ...

Python中的类是普通对象,当您从一个继承时,您也只是从一个对象继承。

例如,这也有效:

class Foo(Bar if x == 3 else Baz):
    ...

事实上,我无法想到这种情况无法奏效的情况。即使这是完全有效的:

try:
    ...
except (FooExc if x == 3 else BarExc):
    ...

因此,不仅Python中的类对象,它们在所有情况下也被视为对象。

更一般地说,生成类称为元编程;它是许多语言中的常见做法(既有动态也有编译和静态类型),而且通常没有什么"很奇怪"关于执行此操作的代码,只要保持健全性和可读性。它与从其他函数创建和返回函数一样正常(在函数式编程中极为普遍),或实际上返回任何对象。

答案 1 :(得分:1)

试试这个:

def DefForm():
    class F(object):
        foo = bar

    return F

FClass = DeftForm()

class MyClass(FClass):
    pass

m = myClass()
m.foo