有以下代码:
>>> class Foo:
... zope.interface.implements(IFoo)
...
... 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
显然,的调用zope.interface.implements
以某种方式改变了类的属性和行为Foo
。
这是怎么发生的?如何在代码中使用这种方法?
示例代码是zope.interface模块的一部分。
该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.x
zope.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
我正在处理打字稿,并将一个函数传递给另一个函数。 如果我有一个传递到typescript中另一个函数的函数,我应该如何编写类型? 我尝试了,但似乎不起作用。
我在这里查过了https://github.com/Microsoft/TypeScript/blob/master/doc/spec.md这是TypeScript语言规范,但我找不到如何声明函数的返回类型。 我在下面的代码中展示了我所期望的: 我知道我可以用
本文向大家介绍如何使用JSP声明来声明类的对象?,包括了如何使用JSP声明来声明类的对象?的使用技巧和注意事项,需要的朋友参考一下 声明声明了一个或多个变量或方法,您可以稍后在JSP文件中的Java代码中使用它们。在JSP文件中使用变量或方法之前,必须先声明该变量或方法。 以下是JSP声明的语法- 您可以编写与上述语法等效的XML,如下所示- 以下是JSP声明中对象声明的示例-
本文向大家介绍如何在Java 9的JShell中声明引用类型?,包括了如何在Java 9的JShell中声明引用类型?的使用技巧和注意事项,需要的朋友参考一下 与值类型不同,引用类型不会直接存储其值。相反,它将存储存储值的地址 。这意味着引用类型包含指向另一个保存数据的存储位置的指针。引用类型为String,数组,类和委托。 片段1 我n个下面的代码片段,两个新的动物对象是在堆上创建的。它们的存储
5.1. 函数声明 函数声明包括函数名、形式参数列表、返回值列表(可省略)以及函数体。 func name(parameter-list) (result-list) { body } 形式参数列表描述了函数的参数名以及参数类型。这些参数作为局部变量,其值由参数调用者提供。返回值列表描述了函数返回值的变量名以及类型。如果函数返回一个无名变量或者没有返回值,返回值列表的括号是可以省略的。如
问题内容: 如果我在Swift中需要自定义类型,可以,该怎么办?(类似于闭包语法typedef) 问题答案: 使用关键字代替