当前位置: 首页 > 面试题库 >

提供Python 3.6元类的__classcell__示例

庄经国
2023-03-14
问题内容

根据3.6.0文档:

CPython实现细节 :在CPython 3.6和更高版本中,__class__
单元作为__classcell__类名称空间中的条目传递到元类。如果存在,则必须将其传播到type.__new__
调用,以便正确初始化该类。如果不这样做,将导致DeprecationWarningPython 3.6以及
RuntimeWarning将来的版本。

有人可以提供正确执行此操作的示例吗?

一个实际需要它的例子?


问题答案:

如果您使用依赖于类体内的__class__可用或引用的super,则会发出警告__class__

文字实质上是说,如果您定义自定义元类并在将其传递给之前篡改所获得的名称空间,则需要这样做type.__new__。你需要小心,始终确保你传递__classcell__type.__new__你的metaclass.__new__

也就是说,如果您创建了一个要传递的新名称空间,请始终检查是否__classcell__在创建的原始名称空间中定义了该名称空间并将其添加:

class MyMeta(type):
    def __new__(cls, name, bases, namespace):
        my_fancy_new_namespace = {....}  
        if '__classcell__' in namespace:
             my_fancy_new_namespace['__classcell__'] = namespace['__classcell__']
        return super().__new__(cls, name, bases, my_fancy_new_namespace)

您在注释中链接的文件实际上是尝试发行的许多补丁程序中的第一个,issue23722_classcell_reference_validation_v2.diff也是发出此文件的最后一个补丁程序,发行于23722。

正确执行此操作的示例可以在对Django发出的pull请求中看到,该请求使用此请求修复了Python
3.6中引入的问题:

new_attrs = {'__module__': module}
classcell = attrs.pop('__classcell__', None)
if classcell is not None:
    new_attrs['__classcell__'] = classcell
new_class = super_new(cls, name, bases, new_attrs)

__classcell__传递之前被简单地添加到新的命名空间type.__new__



 类似资料:
  • 我试图支持类的类似元组的结构化绑定访问。为了简单起见,我将在本文的其余部分使用以下类: (我知道这个类支持开箱即用的结构化绑定,但假设它不支持。) 为了能够像元组一样访问的成员,我们必须专门化和: 我们需要的最后一部分是测试:: 这是可行的。但是,我想返回对成员的引用,就像一样。因此,我实现如下: 然而,在这个版本中,以下代码 产生错误(GCC 7.1): “std::tuple_元素”类型的绑定

  • 文件位置:GatewayWorker/Lib/Gateway.php LibGateway类是Gateway/BusinessWorker模型中给客户端发送数据的类。 提供了单发、群发以及关闭客户端连接的接口。 提示 GatewayWorker提供的所有接口都是支持分布式调用的,所以业务代码不需要任何更改,直接就可以分布式部署。

  • 随着@provides方法变得更加复杂,可以使用Provider接口将这些方法移动到单独的类中。 class SpellCheckerProvider implements Provider<SpellChecker> { @Override public SpellChecker get() { String dbUrl = "jdbc:mysql://localhost

  • 问题内容: class Node: def append_child(self, node: Node): if node != None: self.first_child = node self.child_nodes += [node] 我该怎么办?因为当我运行它时,它说。 我应该只删除and实例在函数中检查它吗?但是,我该如何访问的属性(我希望它是类的实例)? 我不知道如何在Python,

  • 本文向大家介绍Python3.6简单反射操作示例,包括了Python3.6简单反射操作示例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Python3.6简单反射操作。分享给大家供大家参考,具体如下: 注释中说明的s1.py如下: 程序运行结果: 更多关于Python相关内容感兴趣的读者可查看本站专题:《Python面向对象程序设计入门与进阶教程》、《Python数据结构与算法教程》、《

  • 问题内容: 我正在编写要与Azure Worker角色一起使用的F#。我希望类将连接字符串a作为参数。我创建一个数据库连接 但是dbSchema是一种类型,因此无法将其嵌入到我的类中(另一种类型)。我可以创建两个单独的模块,一个与数据库连接,另一个与我的课程 但是,如何在类的构造函数中使用connectionString创建连接? 问题答案: SQL数据库的类型提供程序将连接字符串用于两个不同的目