gpt4 book ai didi

python - zope.interface 可以定义类的 __init__ 方法应该是什么样子吗?

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

我有几个相似的类,它们都将由相同的代码初始化,因此需要具有相同的“构造函数签名”。 (动态 Python 中真的有构造函数和签名吗?我离题了。)

使用 zope.interface 定义类 __ init __ 参数的最佳方法是什么?

我将粘贴一些我用来试验 zope.interface 的代码以方便讨论:


from zope.interface import Interface, Attribute, implements, verify

class ITest(Interface):
required_attribute = Attribute(
"""A required attribute for classes implementing this interface.""")
def required_method():
"""A required method for classes implementing this interface."""

class Test(object):
implements(ITest)
required_attribute = None
def required_method():
pass

print verify.verifyObject(ITest, Test())
print verify.verifyClass(ITest, Test)

我不能只在 ITest 中定义一个 __ init __ 函数,因为它会被 Python 解释器特殊对待 - 我想?无论如何,它似乎不起作用。那么,使用 zope.interface 定义“类构造函数”的最佳方法是什么?

最佳答案

首先:提供实现接口(interface)的概念有很大区别。

基本上,类实现一个接口(interface),这些类的实例提供该接口(interface)。毕竟,类是实例的蓝图,详细说明了它们的实现。

现在,接口(interface)描述了实例提供的实现,但是__init__方法不是实例的一部分!它是类直接提供的接口(interface)的一部分(Python 术语中的类方法)。如果您要在接口(interface)中定义一个 __init__ 方法,您就是在声明您的实例具有(提供)一个 __init__ 方法好吧(作为实例方法)。

因此,接口(interface)描述的是您获得的实例类型,而不是如何获得它们的方式。

现在,接口(interface)不仅仅用于描述实例提供的功能。您还可以将接口(interface)用于 Python 中的任何种类的对象,包括模块和类。您必须使用 directlyProvides 方法为它们分配接口(interface),因为您不会调用它们来创建实例。您还可以使用类或模块声明中的 @provider() 类装饰器或 classProvidesmoduleProvides 函数来获得相同的效果结果。

在这种情况下,您需要的是工厂定义;类是在被调用时生成实例的工厂,因此工厂接口(interface)必须提供一个 __call__ 方法来指示它们是可调用的。这是使用工厂接口(interface)设置的示例:

from zope import interface

class ITest(interface.Interface):
required_attribute = interface.Attribute(
"""A required attribute for classes implementing this interface.""")
def required_method():
"""A required method for classes implementing this interface."""

class ITestFactory(interface.Interface):
"""Creates objects providing the ITest interface"""
def __call__(a, b):
"""Takes two parameters"""

@interface.implementer(ITest)
@interface.provider(ITestFactory)
class Test(object):
def __init__(self, a, b):
self.required_attribute = a*b

def required_method():
return self.required_attribute

zope.component套餐为您提供便利class and interface for factories ,添加一个 getInterfaces 方法以及一个标题和描述,使发现和内省(introspection)更容易一些。然后,您可以将 IFactory 接口(interface)子类化,以更好地记录您的 __init__ 参数:

from zope import component

class ITestFactory(component.interfaces.IFactory):
"""Creates objects providing the ITest interface"""
def __call__(a, b):
"""Takes two parameters"""

testFactory = component.Factory(Test, 'ITest Factory', ITestFactory.__doc__)
interface.directlyProvides(testFactory, ITestFactory)

您现在可以将该工厂注册为 zope.component 实用程序,例如,允许其他代码找到所有 ITestFactory 提供程序。

我在这里使用 zope.interface.directlyProvides 将工厂实例标记为您的子类 ITestFactory 接口(interface),作为 zope.component.Factory 实例一般只提供IFactory接口(interface)。

关于python - zope.interface 可以定义类的 __init__ 方法应该是什么样子吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5365348/

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