python3 从父 class 动态创建方法

pyhon3 dynamically create methods from parent class

假设我有一个 class 定义如下:

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

我想创建一个派生的 class 并自动定义父 class 中以 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 还有 non-so-hacky/pytonic 实现这个的方法吗?

您不能在没有 class 定义之外的参数的情况下使用 super()。为了执行查找 super() needs two arguments。此外,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