【发布时间】:2020-09-22 16:32:43
【问题描述】:
所以我在一本书中读到,如果你想从 list、dict 或 str 等内置类型进行扩展,并且想要覆盖魔法方法,你应该使用 UserList、@ 987654329@ 和 UserString 分别来自 collections 模块。显然,这是因为基类是在 CPython 中实现的,这些方法不会相互调用,因此,覆盖它们没有或不需要的影响。
我想知道是否与UserList 类等类似,是否存在一个可用于“正确”扩展object 类的类。我查看了PyObjectdocumentation,发现this,还有this post,但我既不想用C扩展,也不想说。我在 collections 模块或其他任何地方都找不到任何东西。
我问的原因是因为我之前的一个问题'Is it possible to transform default class dunder methods into class methods?',我有一种预感,我的方法不起作用的原因与我之前概述的相同。
【问题讨论】:
-
你能澄清一下你想做什么吗?
UserList的情况与链接的问题完全不同。内置对象的方法(例如list)不会调用同一对象的other方法,例如list.__iter__不会在子类上使用覆盖的list.__getitem__(他们是否应该这样做以及以什么顺序是有争议的)。这确实不意味着您不能覆盖特殊方法。一个类'__getitem__是一个完全独立于类'class'(又名元类)__getitem__的东西,它们需要被单独覆盖。 -
对于你的最后一个问题,你需要元类...对于这个问题
object使用type。所以你也可以使用type -
感谢您的 cmets @MisterMiyagi @vks!不过,我很难解决这个问题。你是说元类和父类不一样吗?
-
是的,父/基类和元类是两个不同的东西。父/基类满足
issubclass(my_class, base_class)——类“是”其基类的变体。元类是类的类——即isinstance(my_class, meta_class)。一个类“是一个实例”它的元类。 -
我不太确定您所说的
UserObject究竟是什么意思,但没有什么可以接近的。abc.ABC可能是相关的,尽管它用于不同的目的。请注意,您可以创建自己的UserObject,就像您可以创建自己的UserList。
标签: python class oop cpython metaclass