gpt4 book ai didi

python - `super`类是如何实现代理设计模式的?

转载 作者:太空宇宙 更新时间:2023-11-03 14:33:15 25 4
gpt4 key购买 nike

Python 简介

super(cls,obj) returns a super-object of object obj (which must be an instance of class cls or of any subclass of cls), suitable for calling superclass methods.

来自https://docs.python.org/3.6/library/functions.html#super

super([type[, object-or-type]]) returns a proxy object that delegates method calls to a parent or sibling class of type.

A comment by Martijn Pieters表示 super(cls,obj) 的返回对象是代理设计模式的一个示例。

在 Gamma 等人的设计模式中,the proxy design pattern is implemented by inheriting the class of the subject of proxy

enter image description here

但是我发现super类仅从object继承,而不是从代理的主题继承,即“类型的父类或兄弟类” ”。所以我想知道super类是如何实现代理设计模式的?通过鸭子打字?

谢谢。

最佳答案

它只是自定义 dunder method __getattribute__ :从 super 对象检索的所有属性都是自定义的,并且尊重为其创建 super 对象的类的 __mro__

这意味着:Python 语言不需要实际继承正在代理的类型来提供对其属性的访问。属性访问可以使用不同的机制进行完全定制,将任何想要代理的属性重定向到原始类。自定义 __getattribute__ 可能是“更强”的属性访问自定义,但也有 __getattr__ 或使用描述符。

因此,进一步回答 - 我对“鸭子类型”的理解是一个对象,该类提供了一组最小的属性和方法,以便在尝试像其他对象一样使用时“看起来像”另一个对象。在这种 View 下,我们可以说 super 确实使用了鸭子类型,因为在尝试从 super 对象检索方法和属性时,这些将从代理类型中获取。

但是,super 类不会尝试模仿其 repr 中的代理类型,也不会像 Python 对象那样进行自省(introspection)(通过使用 dir 或检查对象的 __dict__)。但由于鸭子类型也不需要这样做,因此它只需作为原始对象来实现所需的目的,通常是获取并调用具有硬编码名称的方法。所以,是的,“鸭子打字”。

请注意,如果需要,Python 自定义功能将尽可能允许“super”向代理类上的 issubclass 调用返回“True”。 (事实并非如此,因为如上所述没有必要)。

关于python - `super`类是如何实现代理设计模式的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47125591/

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