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
假设我有一个 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