python - 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的方式来实现这一点吗?
解决方案
您不能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
推荐阅读
- java - Android appcompat-v7 库无法识别
- python - 如何使用 python 在 c:/windows/system32 文件夹中创建文件
- amazon-web-services - 将 Docker Compose 应用程序持续部署到 AWS/EC2
- python - 初学者的神经网络
- python - 遍历列表字典并输出键和值
- apache - 在 docker nanoserver 中安装 sqlserv
- scala - 奇怪的 scala 错误。找到:scala.Double 需要 Double
- c# - 如何在 Selenium 中选择多个元素(不是
- node.js - 添加 mobx 商店时未定义窗口(服务器端渲染)
- node.js - react 原生实时聊天