gpt4 book ai didi

Python:在初始评估后向类添加父类

转载 作者:太空狗 更新时间:2023-10-29 21:58:59 25 4
gpt4 key购买 nike

一般 Python 问题

我正在导入具有以下类结构的 Python 库(称为 animals.py):

class Animal(object): pass

class Rat(Animal): pass

class Bat(Animal): pass

class Cat(Animal): pass

...

我想为每个物种类(RatBatCat, ...);但是,我无法更改正在导入的库的实际来源,因此它必须是运行时更改。

以下似乎有效:

import animals

class Pet(object): pass

for klass in (animals.Rat, animals.Bat, animals.Cat, ...):
klass.__bases__ = (Pet,) + klass.__bases__

这是在不修改要修改类的源定义的情况下将父类注入(inject) Python 继承树的最佳方法吗?

激励环境

我正在尝试将持久性移植到控制实验室设备的大型库中。弄乱它是不可能的。我想试试 ZODB 的 Persistent。我不想编写 mixin/facade 包装器库,因为我在我的应用程序代码中处理 100 多个类和大量需要更新的导入。我正在通过仅在我的入口点进行黑客攻击来测试选项:设置数据库,如上所示进行修补(但在动物模块上使用内省(introspection)而不是显式列表来拉动物种类)然后在我退出时关闭数据库。

Mea Culpa/请求

这是一个有意提出的一般性问题。我对注入(inject) parent 的不同方法感兴趣,并对这些方法的优缺点发表评论。我同意这种运行时的诡计会使代码变得非常困惑。如果我选择 ZODB,我会做一些明确的事情。现在,作为 python 的普通用户,我对一般情况很好奇。

最佳答案

您的方法几乎就是动态执行的方法。真正的问题是:这个新的父类添加了什么?如果您试图将自己的方法插入到已经存在于类中的方法链中,并且它们没有正确编写,您将无法做到;如果您要添加原始方法(例如接口(interface)层),那么您可能只使用函数。

我是一个拥护 Python 动态特性的人,使用您提供的代码不会有任何问题。确保您有良好的单元测试(动态或非动态;),并且修改继承树实际上可以让您做您需要的,并享受 Python!

关于Python:在初始评估后向类添加父类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7408216/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com