构造类对象后执行代码

2023-12-14

我希望通过让每个子类在父类保存的列表中注册自己来创建给定类的所有子类的列表,即如下所示:

class Monster(object):
    monsters = list()
class Lochness(Monster):
    Monster.monsters.append(Lochness)
class Yeti(Monster):
    Monster.monsters.append(Yeti)

这显然不起作用,因为当我想将它们添加到列表中时,这些类还没有创建。而且,如果它是自动完成的,那就更好了(比如 __subclass__ )

我知道 __subclass__ 具有此功能,但我想知道(为了我自己的启发)您将如何自己实现它。

您似乎想要创建元类的某种子类,该子类正在创建所有内容以将其注册到 Monster 中?或者这完全没有根据


Classes already注册定义了哪些子类;打电话给class.__subclasses__() method获取列表:

>>> class Monster(object):
...     pass
... 
>>> class Lochness(Monster):
...     pass
... 
>>> class Yeti(Monster):
...     pass
... 
>>> Monster.__subclasses__()
[<class '__main__.Lochness'>, <class '__main__.Yeti'>]

.__subclasses__()返回一个列表目前还活着子类。如果您想清除所有引用Yeti (del Yeti在模块中,删除所有实例、子类、导入等),然后当您调用时它将不再列出.__subclasses__()。请注意,本质上,.__subclasses__() is a CPython 实现细节,但该方法存在于所有支持新型类的 Python 版本中(2.2 及更高版本,一直到 3.x)。

否则,挂钩类创建的规范方法是定义一个元类:

class MonstersMeta(type):
    def __new__(metaclass, name, bases, namespace):
        cls = super(MonstersMeta, metaclass).__new__(metaclass, name, bases, namespace)
        if issubclass(cls, Monster) and not cls is Monster:
            Monster.monsters.append(cls)
        return cls

class Monster(object):
    __metaclass__ = MonstersMeta
    monsters = []

class Lochness(Monster):
    pass

class Yeti(Monster):
    pass

Demo:

>>> class Monster(object):
...     __metaclass__ = MonstersMeta
...     monsters = []
... 
>>> class Lochness(Monster):
...     pass
... 
>>> class Yeti(Monster):
...     pass
... 
>>> Monster.monsters
[<class '__main__.Lochness'>, <class '__main__.Yeti'>]

或者你可以使用类装饰器:

def registered_monster(cls):
    Monster.monsters.append(cls)
    return cls

class Monster(object):
    monsters = []

@registered_monster
class Lochness(Monster):
    pass

@registered_monster
class Yeti(Monster):
    pass

Demo:

>>> class Monster(object):
...     monsters = []
... 
>>> @registered_monster
... class Lochness(Monster):
...     pass
... 
>>> @registered_monster
... class Yeti(Monster):
...     pass
... 
>>> Monster.monsters
[<class '__main__.Lochness'>, <class '__main__.Yeti'>]

不同之处在于你将注册怪物的责任放在哪里;与底座MonstersMeta类型,或使用显式装饰器。

无论哪种方式,元类或类装饰器都会注册一个永久引用。您可以使用weakref module如果你真的非常想效仿.__subclasses__()行为。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

构造类对象后执行代码 的相关文章

随机推荐

  • 在表中启用和禁用 td

    td td
  • 如何使用 MUnit 在 Mule Flow 中模拟 Java 组件

    我正在尝试使用 MUnit 对我的一个子流程进行单元测试 我需要模拟一个自定义 Java 组件 但我无法这样做 我的子流程如下
  • 飞碟没有应用内部 CSS

    我在 struts2 操作中使用以下代码 使用飞碟将 HTML 转换为 PDF 它只是按原样打印样式代码 并不应用它 static String readFile String path Charset encoding throws IO
  • 使用本地文件中的背景图像进行绘图布局

    我有同样的问题 如所述这个问题 我希望我的绘图具有本地 png 文件的背景 Using 情节的例子 它使用来自网络的图像 有效 使用本地图像的路径 无论有或没有绝对路径 都不起作用 根据另一个问题的答案进行编码没有帮助 import bas
  • 如何在Canvas中专门绘制Shape

    我里面有一个形状Canvas 像这样
  • Safari 中如何允许跨域请求?

    我有从 localhost 运行的 webapp 因为调试 并且它发出跨域 AJAX 请求 我可以轻松地为 Chrome 设置标志 disable web security 并且 web 应用程序在 Chrome 中按预期工作 但我也需要为
  • MvvmCross - 从视图模型调用 Web 服务

    我是 MvvmCross 和 Android 开发的新手 我需要在视图模型中调用 POST 数据到 JSON Web 服务 然后 我需要在 UI 中显示 Web 服务的结果 我的视图模型的要点如下所示 public class MyView
  • 将网站的 URL 格式化为字符串,并在前面添加 http://

    我有一个评论系统 允许自动链接网址 我正在使用 cakephp 但解决方案更多的是 PHP 这就是正在发生的事情 如果用户输入完全限定的网址http or https 一切安好 但如果他们进入www scoobydoobydoo com它变
  • RequireJS:将路径设置为“忽略”

    我正在使用一个第三方库 通过 Bower 它声明了我不想要的依赖项 它只是样式 是否可以将该依赖项设置为 忽略 或某些此类值 e g define jquery dep i dont want function 在需要配置中 paths j
  • 多重继承 C++ 当基类共享相同的方法名称时,是否有一些限制?

    我以前从未在 C 中使用过多重继承 但我很好奇 因为我在一本书中看到了编织 bst 的实现 通过基类 List 和基类 BinarySearch 树的多重继承 现在我试图编一些愚蠢的例子来理解它是如何工作的 所以我想出了这个 class B
  • 如何在 PHP 中创建幻方?

    我想尝试用 PHP 创建一个魔方 即所有加起来等于相同值的数字网格 但我真的不知道从哪里开始 我知道创建幻方的许多方法 例如在固定位置开始 1 然后每次迭代都朝特定方向移动 但这并没有创建一个真正随机的魔方 而这正是我的目标 我希望能够生成
  • Java:在运行时检查类是否存在[重复]

    这个问题在这里已经有答案了 我正在开发一个依赖于第三方库的软件 由于许可协议 该库无法与软件一起提供 并且用户在启动程序时必须在本地拥有该库 有没有办法检查这个特定的库是否存在于类路径中并且可以加载 如果没有 我想提供一个对话框以允许用户指
  • 如何在 SQL Server 2008 中删除重复行?

    如何删除 SQL Server 2008 中的重复行 最简单的方法是使用 CTE 公用表表达式 当我有原始数据要导入时 我会使用这种方法 我清理它的第一件事是确保没有重复 我对每一行都有某种唯一的句柄 Summary WITH number
  • 如何将多个提交合并到另一个分支作为单个压缩提交?

    我有一个远程 Git 服务器 这是我想要执行的场景 对于每个错误 功能 我创建一个不同的 Git 分支 我继续使用非官方 Git 消息在该 Git 分支中提交代码 在顶级存储库中 我们必须使用官方 Git 消息针对一个错误进行一次提交 那么
  • 为什么 try except 块在 python 3.7 的 Visual Studio 代码中不起作用?

    实现 try except 块时 VS Code 无法识别指定的异常或与此相关的任何异常 前任 try x 1 0 except ZeroDivisionError print You cannot divide by zero 通过终端执
  • 从 contenteditable 填充并保存文本

    我正要开始写自己的富文本编辑器但需要知道是否可以填充文本区域以及如何保存 使用其中的数据 我目前正在使用 CKEditor 但它对于我想要的东西来说太笨重和太大 我将以此为基础 http jsfiddle net Kxmaf 6 我还需要对
  • 如何在自定义验证规则的 pass 函数中发送多个参数

    我正在实现一个自定义验证规则 该规则应该在自定义验证规则的传递函数中采用另一个带有属性和值的参数 当我们在编写自定义验证时实现 Rule 接口时 它不允许我们在 pass 函数中添加第三个参数 但我需要第三个参数 此外 如果有人能够指导我在
  • PLS-00428:此 SELECT 语句中需要 INTO 子句

    我想将 Rownum 存储为变量 而不是使用昂贵的 Join 我需要从 Select 语句中获取此值 因为 Rownum 在不同环境中会有所不同 因此它不能是代码中的文字字符串 对于上下文 此查询在 Oracle Siebel CRM 模式
  • 为什么 不起作用?

    我使用JSF 2 0 hibernate validator4 2 jarvalidation api jar tomcat和Eclipse I put Size min 3 message xxx ManagedBean 中的注释和
  • 构造类对象后执行代码

    我希望通过让每个子类在父类保存的列表中注册自己来创建给定类的所有子类的列表 即如下所示 class Monster object monsters list class Lochness Monster Monster monsters a