您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

提供Python 3.6元类的__classcell__示例

提供Python 3.6元类的__classcell__示例

如果您使用依赖于类体内的__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__

python 2022/1/1 18:45:14 有454人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶