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

在类声明中如何调用函数?

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

在类声明中如何调用函数?

详细的“会发生什么”

zope.interface.implements()
函数检查框架堆栈并更改构造类的
locals()
名称空间(python
dict
)。
class
python语句中的所有内容都在该命名空间中执行,结果形成类主体。

该函数为类命名空间添加了额外的值,

__implements_advice_data__
其中包含一些数据(已传递给该函数的接口以及
classImplements
可调用的接口,这些将在以后使用。

然后,通过

__metaclass__
在命名空间中添加(或更改预先存在的)键,可以在相关类的元类中添加或链接。这样可以确保将来每次创建类的实例时,都会首先调用现在安装的元类。

实际上,这个元类(类顾问)有点曲解。首次创建实例后,它将再次 删除
自身。它只是简单地调用中指定的回调函数,

__implements_advice_data__
以及您传递给原始
implements()
函数的接口,之后立即
__metaclass__
从类中删除键,或将其替换为原始键
__metaclass__
(调用该键以创建第一个类实例)。回调在其自身清理之后,将其
__implements_advice_data__
从类中删除。

短版

总而言之,所有工作

zope.interface.implements()
是:

  • 将传递的接口以及回调添加到类(
    __implements_advice_data__
    )中的特殊属性。
  • 确保使用特殊的元类在首次创建实例时调用该回调。

最后,在道德上等同于定义这样的接口:

class Foo:    def __init__(self, x=None):        self.x = x    def bar(self, q, r=None):        return q, r, self.x    def __repr__(self):        return "Foo(%s)" % self.xzope.interface.classImplements(Foo, IFoo)

除了最后一次通话被推迟到您第一次创建的实例之外

Foo

但是 为什么 要花这么长的时间呢?

zope.interface
第一次开发,巨蟒也没有上课装饰。

zope.interface.classImplements()
创建类后,需要作为函数分别
zope.interface.implements()
调用,并且
类主体 进行的调用可提供有关类实现哪些接口的更好文档。您可以将其放在类声明的顶部,并且每个人在查看该类时都可以看到这一重要信息。在类声明
之后
classImplements()
定位调用并不那么明显和清晰,而对于长类定义,则很容易将其完全遗漏。 __

PEP
3129最终确实向该语言添加了类装饰器,并将它们添加到python
2.6和3.0中。

zope.interface
最早是在python 2.3(IIRC)时代开发的。

现在我们 已经
有了类装饰器,

zope.interface.implements()
已经弃用了,您可以
zope.interface.implementer
改为使用类装饰器:

@zope.interface.implementer(IFoo)class Foo:    def __init__(self, x=None):        self.x = x    def bar(self, q, r=None):        return q, r, self.x    def __repr__(self):        return "Foo(%s)" % self.x


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

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

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