栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

指向Python中静态方法的指针

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

指向Python中静态方法的指针

我喜欢从下至上查看这种行为。

Python中的函数充当“描述符对象”。因此,它具有一种

__get__()
方法。

对具有此类

__get__()
方法的类属性的读取访问将“重定向”到该方法。对类的属性访问以方式执行
attribute.__get__(None,containing_class)
,而对实例的属性访问则映射到
attribute.__get__(instance,containing_class)

函数的

__get__()
方法的任务是将函数包装在一个方法对象中,该对象将包装
self
参数-对于对实例的属性访问而言。这称为绑定方法。

在2.x上进行类属性访问时,函数

__get__()
将返回一个未绑定的方法包装器,而正如我今天所了解的那样,在3.x上它将返回自身。(请注意,该
__get__()
机制在3.x中仍然存在,但是函数只是返回自身。)如果您看一下如何调用它,则几乎是相同的,但是未绑定的方法包装器还会检查
self
参数的正确类型。

一个

staticmethod()
呼叫只是创建一个对象,它
__get__()
调用用于返回最初给出的对象,使其撤销所描述的行为。这就是HYRY的诀窍的工作方式:属性acces取消
staticmethod()
包装,调用再次进行该操作,以便“新”属性与旧属性具有相同的状态,尽管在这种情况下,
staticmethod()
似乎应用了两次(但实际上不是)
)。

(顺便说一句:它甚至可以在这种怪异的情况下工作:

s = staticmethod(8)t = s.__get__(None, 2) # gives 8

虽然

8
不是函数,
2
也不是类。)

在您的问题中,您有两种情况:

cmd = Cmd.cmdonecmd() # works fine

访问该类并询问其

cmdOne
属性,即
staticmethod()
对象。通过其查询
__get__()
并返回原始函数,然后调用原始函数。这就是为什么它可以正常工作的原因。

Cmd.cmd = Cmd.cmdOneCmd.cmd() # unbound error

执行相同的操作,但是将此功能分配给

Cmd.cmd
。下一行是属性访问-
再次
__get__()
执行对函数本身的调用,因此返回未绑定的方法,必须以正确的
self
对象作为第一个参数来调用该方法。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/391384.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号