gpt4 book ai didi

python - 为什么 __prepare__ 将 name 和 bases 作为参数

转载 作者:行者123 更新时间:2023-12-04 17:47:14 24 4
gpt4 key购买 nike

我正在从 2.7 迁移到 3.x,我正在尝试理解 PEP3115 中引入的元类的 __prepare__ 方法。 .

在我见过的大多数示例中,此方法的实现忽略了参数(namebases**kwargs ) 只是返回一个自定义字典,它对提供给元类的 __new____init__ 方法的命名空间做一些有趣的事情。即使是 example in PEP3115不对参数执行任何操作。

我不怀疑 __prepare__ 的签名有一些很好的理由,但我还没有看到用例。

有哪些很好的例子可以证明使 __prepare__ 的签名采用这些参数的合理性?

最佳答案

__prepare__ 将为您所说的类创建一个命名空间,因此我们可以在其中执行一些逻辑,如下所示:

class MyMeta(type):
@classmethod
def __prepare__(metacls, klass_name, bases):
namespace = {'s': 'my string',
'description': 'N/A'}
if klass_name.endswith('Base'):
namespace.update({'description': 'base class'})

return namespace

class KlassBase(metaclass=MyMeta):
def __init__(self, value):
self.value = value

class SubKlass(KlassBase):
def __init__(self, value):
super().__init__(value)

print(KlassBase(5).s)
print(KlassBase(5).description)
print(SubKlass(5).s)
print(SubKlass(5).description)

你得到了:

my string
base class
my string
N/A

我们之所以不这样做,是因为同样的事情可以在元类的其他部分完成,例如:__new__、__init__,或者被后者覆盖。所以大多数时候,我们不会在 __prepare__ 中做这件事

下图是创建类的工作流程,更加清晰:

enter image description here

[抱歉我找不到这张图片的原始出处]

关于python - 为什么 __prepare__ 将 name 和 bases 作为参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47917610/

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