gpt4 book ai didi

python - 如何动态地向接口(interface)添加属性

转载 作者:太空狗 更新时间:2023-10-30 02:32:27 25 4
gpt4 key购买 nike

我需要为界面中的每个属性添加一个属性。因此,我尝试动态修改它以添加它们,但目前收效甚微。

假设我有以下界面:

class IMember(Interface):
first_name = schema.TextLine(title=u'first name')
last_name = schema.TextLine(title=u'last name')

我想这样修改它:

class IMember(Interface):
first_name = schema.TextLine(title=u'first name')
last_name = schema.TextLine(title=u'last name')
visbility_first_name = schema.Bool(title=u'Display: first name')
visbility_last_name = schema.Bool(title=u'Display: last name')

之后我尝试修改该类,但由于它已经初始化,模式已设置,我不确定如何更改它。我也考虑过编写一个指令(例如:interface.Implements()),但仅添加属性似乎相当复杂。

我的最终目标是添加一个带有一组 Bool 小部件的 z3c.form 字段集。

那么,有没有办法在 Python 中实现,还是我必须修改接口(interface)并手动添加所有属性?

谢谢!

最佳答案

您可以使用 InterfaceClass 元类型创建接口(interface)的动态子类。

创建附加模式字段的字典:

fields = {}
for name, attr in IMember.namesAndDescriptions():
if isinstance(attr, schema.Field):
fields['visible_' + name] = schema.Bool(title=u'Display: ' + attr.title)

现在您可以创建一个继承现有接口(interface)的动态接口(interface):

from zope.interface.interface import InterfaceClass

IMemberExtended = InterfaceClass('IMemberExtended', (IMember,), fields)

如果你愿意的话,这一切都可以被包装在一个类装饰器中:

from zope.interface.interface import InterfaceClass
from zope import schema

def add_visibility_fields(iface):
fields = {}
for name, attr in iface.namesAndDescriptions():
if isinstance(attr, schema.Field):
fields['visible_' + name] = schema.Bool(title=u'Display: ' + attr.title)

return InterfaceClass(iface.__name__, (iface,), fields)

您将在现有界面上使用:

@add_visibility_fields
class IMember(Interface):
first_name = schema.TextLine(title=u'first name')
last_name = schema.TextLine(title=u'last name')

这创建了一个子类;您还可以用生成的界面替换整个界面:

def add_visibility_fields(iface):            
fields = {}
for name, attr in iface.namesAndDescriptions():
fields[name] = attr
if isinstance(attr, schema.Field):
fields['visible_' + name] = schema.Bool(title=u'Display: ' + attr.title)

return InterfaceClass(iface.__name__, iface.__bases__, fields)

最后一个版本的演示:

>>> @add_visibility_fields
... class IMember(Interface):
... first_name = schema.TextLine(title=u'first name')
... last_name = schema.TextLine(title=u'last name')
...
>>> IMember.names()
['visible_last_name', 'first_name', 'last_name', 'visible_first_name']

关于python - 如何动态地向接口(interface)添加属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18129531/

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