"元类解析顺序"中可能存在错误?

你好 我有一个A类,带有Metaclass M_A和B类,A的子类 Metaclass M_B,M_A的子类. A类C,B的子类必须具有M_B或IT子类作为Metaclass, 但是,如果我需要在C上"禁用" M_B中的代码怎么办? 正确的方法 这样做似乎是用m_c metaclass,m_b的子类, 实施但不调用父类方法或调用"类型" 方法. 但是,如果我尝试使用其他元素(与M_B无关)这样做,我会得到一个 预期的" TypeError:Metaclass冲突例外". Python 2.4.1(#1,2005年9月16日,17:47:47) [GCC 3.3.4]在Linux2上 键入"帮助","版权","学分"或"许可"以获取更多信息. <类'__ main__.M_B'> 由于显式__ metaclass__属性优先于父 上课,这样的情况是一个错误,应该提出一个例外 元冲突,对吗? 问候, - - Pedro Werneck

# 回答1

您是否阅读了"统一类型和类的"元类"一部分 Python 2.2"?(http://www.python.org/2.2.3/descrintro.html#metaclasses) 它讨论并解释了您似乎遇到的问题.
# 回答2

2005年9月17日02:04:39 -0700 " Simon Percivall" 写道: 是的,我阅读. 您阅读并理解我的信息吗? :) B类,A类的子类,带有METACLASS M_A应该有M_A或 它的子类是元素. 如果您尝试其他任何事情,就会得到一个 TypeError异常如预期. 好的. 但是,如果您尝试"类型",什么都没有 发生. Python 2.4.1(#1,2005年9月16日,17:47:47) [GCC 3.3.4]在Linux2上 键入"帮助","版权","学分"或"许可"以获取更多信息. <类型'type'> 问候, - - Pedro Werneck
# 回答3

我认为这更多是文档问题,而不是错误. 起初看起来似乎很奇怪,但是__ metaclass__和__class__可能是 不同的. 例如,如果m为元素 您获得的元素钩等于M,但是C .__ class__是 仍然是"类型". 在您的示例中,将__ metaclass_设置为" type"不会更改 元素 创建的类,是从基类继承的. 我建议 您要提交文档 漏洞. 不幸的是,关于元类的基本文档有点 缺乏,你有 通过反复试验发现许多事情. Michele Simionato
# 回答4

2005年9月17日08:51:50 -0700 " Michele Simionato" 写道: 你好 这应该发生吗? C的Metaclass必须是M_B的子类. 如果 我尝试与与此层次结构无关的任何其他类别,我会得到一个 元类冲突错误. 但是使用M_A,错误被忽略了,可能 因为pytype_issubtype正在返回1个m_a为m_b的子类型 获胜者和元型将在稍后交换,因此我们以M_B结尾 C的真实类型. 我建议您提交文档错误. 不幸的是,关于元类的基本文档有点缺乏,您必须通过反复试验发现很多东西. 我仍然认为这是一个错误,而不是文档问题 . 问候 - - Pedro Werneck Michele Simionato-http://mail.python.org/mailman/listinfo/python-list(_@_ _) " Pedro Werneck" 在消息中写道 新闻:20050917144655.2E7EC1B7.PE ***********@terra.c om.br ... 作为有时的错误报告审稿人,我感谢您发布此问题 在这里获得比您可能拥有的更广泛,更快的回复 SF. 如果经过进一步的答复,您仍然认为自己已经发现了 错误,请在SourceForge上提交报告. 由于示例和您 关于错误的猜测相对冗长,您可能会考虑 将摘要放在有些狭窄的报告框中,并附加 带有完整报告的单独的" metaclass.txt"文件. 提及你的帖子 这里和任何恢复反应. 因为这是一个相对专业的 和高级问题(例如,我无法评论),请不要 对响应的不耐烦. Terry J. Reedy
# 回答5

在2005年9月17日星期六15:07:01 -0400 " Terry Reedy" 写道: 谢谢...报告ID 1294232,Metaclass搜索顺序中的错误 - - Pedro Werneck
# 回答6

佩德罗·沃内克(Pedro Werneck)写道: <类'__ main__.M_A'> 这应该发生吗? 是的,或者至少我觉得这是一种合理的行为. 你得到的 闸门(M_B),而不是更通用的元素 (M_A),所以您什么都不会失去任何东西. 请记住,给定C类,它 Metaclass由C .__ class__给出,而不是由c .__ metaclass__ 尽管有名字. 我写了一些代码以自动解决元素 冲突(例如,请参阅我的牛津演讲http://www.phyast.pitt.edu/~micheles...d-lectures.zip) 以同样的方式,它使用了最严格的元素. 您认为在这种情况下应该提出错误,因为"错误 永远不要静静地通过".可能是.您可以自由发布 错误报告并查看开发人员的意见. 我很开心 足够当前的行为,我只会 更新文档. Michele Simionato Michele Simionato
# 回答7

2005年9月18日00:39:31 -0700 " Michele Simionato" 写道: <类'__ main__.M_B'> 您可以自由发布错误报告并查看开发人员的意见. 我几个小时前发布了. 谢谢你. - - Pedro Werneck
# 回答8

如果您阅读了我提到您的文档,您还阅读了 示例在其中定义了M1,M2,M3和M4类? 该示例的讨论的引用: "对于D类,显式元素M1不是基础的子类 元类(M2,M3),但选择M3满足约束,因此 d .__类是M3." 那不是你在做什么吗?
# 回答9

2005年9月18日10:33:11 -0700 " Simon Percivall" 写道: 是的,这个示例具有相同的不一致. ... Trackback(最近的最新电话): 文件" ",第1行,在? TypeError:调用元口碱时错误 对于Cl 屁股D2,显式元素X不是基座的子类 元类,就像示例中的M1一样,但是使用X,您会得到一个 MetaClass冲突错误,而使用M1则没有. 选择M3满足 约束,但是为什么在使用M1而不使用X时会选择它? 那正是我的意思. 如果我想要M3或M2,我会使用 显式dict ['__ metaclass__'] = m3或m2. 既然我想这样做 对于不满足约束的M1,这是一个错误,并且 根据Python设计概念,它应该提出相同的 例外. 我不知道这是否是默默地去基地的故意决定 类元类如果明确的元素不满足 约束,但是任何基类元类的基类,但是 如果是这样,当显式元素没有 与基类元类的关系,这似乎很奇怪 设计决策,不仅来自Python的"明确性和简单性" 立场. 如果这实际上不是错误,则只是像先生这样的文档问题. Simionato认为,确定上面几行的第一个规则 您的报价更为复杂,应从以下方式更改: *如果存在dict ['__ metaclass_'],则使用它. 更喜欢: *如果存在dict ['__ metaclass__'],并且等于或等于或一个子类 碱的每个元素都被使用; 如果存在并且是一个 基地的任何元类的基类,第一基类 使用元类. 如果存在并且不满足其中任何一个 限制,typeError被提高. 如果我是对的,这是一个错误,尽管我不太熟悉 python内部我对错误上可能出错的猜测 我昨天填写的报告. 如果不是错误,这是预期的 行为,我认为这与Python设计概念不一致, 尤其是"错误永远不要静静地通过"和"明确更好 而不是隐性".如果只是文档问题,则是 搜索顺序比记录的要复杂得多. 如果我完全 在所有这些方面,错了,也许最好不要浪费我们的时间. :) 谢谢 - - Pedro Werneck http://sourceforge.net/tracker/index...70&atid=105470
# 回答10

我绝对认为这是预期的行为:示例显示 如何以及为什么运作; 我绝对同意应该是 记录得更好.
# 回答11

2005年9月18日12:58:22 -0700 " Simon Percivall" 写道: 是的. 我终于明白了这个决定,现在我同意这不是一个错误, 这是预期的行为. 如果显式类是 层次结构,但不是基类的子类,它将搜索 对于更专业的元类并使用它,因为它将 班级需要的任何东西都符合我明确设置的元类. 我将更改错误报告,并添加一些建议的 文档. 谢谢 - - Pedro Werneck
# 回答12

在2005年9月17日星期六12:41:09 -0300,Pedro Wer 脖子写道:是的,我读了. 您阅读并理解我的信息吗? :)B类,A类的子类,带有Metaclass M_A的A类子类应为M_A ORA子类作为Metaclass. 如果您尝试其他任何方法,则会根据预期获得AtypeError异常. 好的. 但是,如果您尝试使用'type',那么notherhappens.python 2.4.1(#1,2005年9月16日,17:47:47)[gcc 3.3.4]在linux2type" help"," help"," oferage","版权","信用","信用","或" 许可"以获取更多信息. fwiw,我认为__ metaclass__可以是任何可叫的,但这似乎是 第一个键入.__ new__调用检查的参数 类型(名称,基础,cdict)似乎具有与 类型.__新__(类型,名称,基础,cdict). 也许必须 MRO上的"真实"类,不是一个,或者是通配符;-) 我并没有真正抓住错误消息的真实含义,没有 以前处理过掌冲突. 今天还没准备好,对不起;-) ('愚蠢','结果') 问候, Bengt Richter
# 回答13

在2005年9月19日星期一05:22:09 GMT boxpor@oz..net(Bengt Richter)写道: 是的...这是预期的行为. 实际上,问题已经是 已解决,实际上只是一个文档问题. 在此处查看错误报告上的评论:http://sourceforge.net/tracker/index...70&atid=105470 - - Pedro Werneck

标签: python

添加新评论