📜  Python 接口模块

📅  最后修改于: 2022-05-13 01:54:27.367000             🧑  作者: Mango

Python 接口模块

在像Python这样的面向对象语言中,接口是方法签名的集合,应该由实现类提供。实现接口是一种编写有组织的代码并实现抽象的方法。

zope.interface为Python提供了“对象接口”的实现。它由 Zope Toolkit 项目维护。该包直接导出两个对象,“接口”和“属性”。它还导出了几个辅助方法。它旨在提供比 Python 内置的 abc 模块更严格的语义和更好的错误消息。

声明接口

在Python中,接口是使用Python类语句定义的,是interface.Interface的子类,它是所有接口的父接口。

Syntax : 
class IMyInterface(zope.interface.Interface):
    # methods and attributes

例子

import zope.interface
  
  
class MyInterface(zope.interface.Interface):
    x = zope.interface.Attribute("foo")
    def method1(self, x):
        pass
    def method2(self):
        pass
      
print(type(MyInterface))
print(MyInterface.__module__)
print(MyInterface.__name__)
  
# get attribute
x = MyInterface['x']
print(x)
print(type(x))

输出 :


__main__
MyInterface


实现接口

接口充当设计类的蓝图,因此接口是使用类上的实现器装饰器来实现的。如果一个类实现了一个接口,那么该类的实例提供该接口。除了类实现的功能之外,对象还可以直接提供接口。

Syntax : 
@zope.interface.implementer(*interfaces)
class Class_name:
    # methods

例子

import zope.interface
  
  
class MyInterface(zope.interface.Interface):
    x = zope.interface.Attribute("foo")
    def method1(self, x):
        pass
    def method2(self):
        pass
  
@zope.interface.implementer(MyInterface)
class MyClass:
    def method1(self, x):
        return x**2
    def method2(self):
        return "foo"

我们声明 MyClass 实现了 MyInterface。这意味着 MyClass 的实例提供了 MyInterface。

方法

  • implementedBy(class) –返回一个布尔值,如果类实现了接口则返回 True,否则返回 False
  • providedBy(object) –返回一个布尔值,如果对象提供接口则返回 True,否则返回 False
  • providedBy(class) –返回 False,因为类不提供接口但实现了它
  • list(zope.interface.implementedBy(class)) –返回一个类实现的接口列表
  • list(zope.interface.providedBy(object)) –返回对象提供的接口列表。
  • list(zope.interface.providedBy(class)) –返回空列表,因为类不提供接口但
    实现它。
import zope.interface
  
  
class MyInterface(zope.interface.Interface):
    x = zope.interface.Attribute('foo')
    def method1(self, x, y, z):
        pass
    def method2(self):
        pass
  
@zope.interface.implementer(MyInterface)
class MyClass:
    def method1(self, x):
        return x**2
    def method2(self):
        return "foo"
obj = MyClass()
  
# ask an interface whether it 
# is implemented by a class:
print(MyInterface.implementedBy(MyClass))
  
# MyClass does not provide 
# MyInterface but implements it:
print(MyInterface.providedBy(MyClass))
  
# ask whether an interface
# is provided by an object:
print(MyInterface.providedBy(obj))
  
# ask what interfaces are 
# implemented by a class:
print(list(zope.interface.implementedBy(MyClass)))
  
# ask what interfaces are
# provided by an object:
print(list(zope.interface.providedBy(obj)))
  
# class does not provide interface
print(list(zope.interface.providedBy(MyClass)))

输出 :

True
False
True
[]
[]
[]

接口继承

接口可以通过将其他接口列为基本接口来扩展其他接口。

职能

  • extends(interface) –返回布尔值,一个接口是否扩展另一个接口。
  • isOrExtends(interface) –返回布尔值,无论接口是相同的还是扩展另一个。
  • isEqualOrExtendedBy(interface) –返回布尔值,无论接口是相同的还是一个被另一个扩展。
import zope.interface
  
  
class BaseI(zope.interface.Interface):
    def m1(self, x):
        pass
    def m2(self):
        pass
  
class DerivedI(BaseI):
    def m3(self, x, y):
        pass
  
@zope.interface.implementer(DerivedI)
class cls:
    def m1(self, z):
        return z**3
    def m2(self):
        return 'foo'
    def m3(self, x, y):
        return x ^ y
      
# Get base interfaces
print(DerivedI.__bases__)
  
# Ask whether baseI extends 
# DerivedI
print(BaseI.extends(DerivedI))
  
# Ask whether baseI is equal to
# or is extended by DerivedI
print(BaseI.isEqualOrExtendedBy(DerivedI))
  
# Ask whether baseI is equal to
# or extends DerivedI
print(BaseI.isOrExtends(DerivedI))
  
# Ask whether DerivedI is equal
# to or extends BaseI
print(DerivedI.isOrExtends(DerivedI))

输出 :

(, )
False
True
False
True