【问题标题】:Inherit from class dynamically created in a function从函数中动态创建的类继承
【发布时间】:2014-04-16 15:41:27
【问题描述】:

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

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

    return F

class MyClass(DefForm):
    pass

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

【问题讨论】:

    标签: python oop metaprogramming


    【解决方案1】:

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

    class MyClass(DefForm()):
         ...
    

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

    例如,这也有效:

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

    事实上,我想不出这不起作用的情况。即使这是完全有效的:

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

    因此,Python 中的类不仅是对象,而且在所有情况下都被视为对象。

    一般来说,生成类称为元编程;这是许多语言(动态以及编译和静态类型)的常见做法,只要保持理智和可读性,执行此操作的代码通常没有什么“奇怪”的地方。它就像从其他函数创建和返回函数(这在函数式编程中非常普遍)一样正常,或者实际上返回任何对象。

    【讨论】:

    • 该语法允许广泛的表达式来代替一个或多个特定的类名。 Python 2 允许使用 test 表达式(本质上,值 or'd 一起或 if...else 表达式)或 lambda 定义(我实际上不确定如何解释)。 Python 3 本质上将基类列表视为函数的参数列表,因此语法是相同的。例如,x=(A, B); class C(*x): pass 是合法的,只要 x 的元素是有效的类。
    • Python 2 允许任何表达式 AFAIK;不知道 Python 3 中的泼溅技巧;感谢您添加。
    • 这里是Python 2Python 3 语法的链接,供感兴趣的人使用。请参阅每个中的classdef 规则。
    【解决方案2】:

    试试这个:

    def DefForm():
        class F(object):
            foo = bar
    
        return F
    
    FClass = DeftForm()
    
    class MyClass(FClass):
        pass
    
    m = myClass()
    m.foo
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-28
      • 1970-01-01
      • 2018-03-10
      • 2016-08-19
      • 2011-02-21
      • 2021-08-23
      • 2017-12-23
      • 1970-01-01
      相关资源
      最近更新 更多