首页 > 解决方案 > pyhon3从父类动态创建方法

问题描述

假设我有一个这样定义的类:

classA():
    def do_one():
        print("one")
    def do_two():
        print("two")
    def some_other():
        print("other")

我想创建一个派生类并自动定义从父类开始的每个方法do

我试过这个:

class B(A):
    pass

for m in dir(A):
    if m[0:3] == "do_":
        def dm(self):
            print("somebething before")
            getattr(super(),m)()
        dm.__name__ = m
        setattr(B,m,dm)

但是我收到了这个错误:RuntimeError: super(): __class__ cell not found 还有一种不那么hacky/pytonic的方式来实现这一点吗?

标签: pythonpython-3.7

解决方案


您不能super()在类定义之外不使用参数。为了执行查找super() 需要两个参数。此外,dm需要将 的定义包装在另一个函数中。否则,当它执行时,值m将从全局范围中获取。

将这些放在一起,以下应该可以工作:

class A():
    def do_one(self):
        print("one")

    def do_two(self):
        print("two")

    def some_other(self):
        print("other")


class B(A):
    pass


for m in dir(B):
    if m[0:3] == "do_":

        def redef(m):
            def dm(self):
                print("something before")
                getattr(super(B, self), m)()

            return dm

        setattr(B, m, redef(m))

如果你运行:

x = B()
x.do_one()
x.do_two()
x.some_other()

它会给:

something before
one
something before
two
other

推荐阅读