Plone aq_inner(和朋友)是否仍然需要在仅灵巧的环境中使用?

Plone aq_inner(和朋友)是否仍然需要在仅灵巧的环境中使用?,plone,zope,dexterity,Plone,Zope,Dexterity,我有一个浏览器视图,在其调用方法中有如下内容: def __call__(self): context = aq_inner(self.context) parent = aq_parent(context). ... 把pdb放在一开始就玩它,似乎对于灵巧性没有必要使用它,是吗 ipdb> self.context, id(self.context), self.context.__class__ (<Container at /plone/ausgabe

我有一个浏览器视图,在其调用方法中有如下内容:

def __call__(self):
    context = aq_inner(self.context)
    parent = aq_parent(context).
    ...
把pdb放在一开始就玩它,似乎对于灵巧性没有必要使用它,是吗

ipdb> self.context, id(self.context), self.context.__class__
(<Container at /plone/ausgaben>, 4651890160, <class 'plone.dexterity.content.Container'>)
ipdb> aq_inner(self.context), id(aq_inner(self.context)), aq_inner(self.context).__class__
(<Container at /plone/ausgaben>, 4651890160, <class 'plone.dexterity.content.Container'>)
ipdb>self.context,id(self.context),self.context.\uu类__
(, 4651890160, )
ipdb>aq_内部(self.context)、id(aq_内部(self.context))、aq_内部(self.context)。\uu类__
(, 4651890160, )
因此,无论是否使用aq_内部,结果都是相同的


所以问题是:敏捷性(作为self.context,在我们的项目中,实际上一切都是基于敏捷性的)是否可以防止我们不得不用aq_-inner和aq_-parent等来包装一切,而直接使用对象或
\uu-parent\uu
指针?

就像在contenttypes一样,DX contenttypes也是aq包装的。因此,您将面临与AT相同的行为(问题:-)

正如斯达普顿在他的
aq\u parent(instance)=instance.\uu parent\uuuu
中所说的那样。父指针ist仍然通过采集实现

但与AT有一点不同

如果创建新的DX obj,则会发生以下情况:

  • 将被调用以创建DX obj-此时内容尚未aq包装。因此,如果您订阅
    ObjectCreatedEvent
    ,您将拥有一个非aq包装的obj

  • 将被调用,这会将创建的DX内容添加到容器中。在
    ObjectAddedEvent中,将激发
    。如果订阅此活动,您将拥有aq包装的dx内容

  • 这在AT中是不同的,当然在这种情况下会触发其他事件,但AT内容始终是aq包装的(也在工厂中,同时添加新的AT obj)


    如果我误解了什么,请告诉我

    我怀疑你会发现id(aq_base(self.context))有显著的不同。确实,
    aq_base
    有一个不同的id,并且名称上没有路径,但问题仍然没有答案:在只有灵巧性的环境中,我能忘记使用aq_-inner和friends吗?假设包装足够简单/一致,不需要aq_-inner,但是请记住,
    \uuuuu parent\uuuuuu
    指针需要获取包装器,而不是相反——IIRC
    assert getattr(aq_base(self.context),“\uuu parent\uuuuuuuuu',None”是None
    。感谢您的回答,问题仍然主要是关于,一旦对象存在并且您以某种方式(在我的示例中,通过self.context)获得它,是否仍需要显式使用aq_内部和aq_父级?通过测试,我认为这是不需要的。如果您有一个具有属性
    title
    的容器,并且此容器中的一个项目没有属性
    title
    ,并且您调用
    item.title
    ,它仍然会返回容器的
    title
    ,除非您使用
    AQU explicit
    。只有当您只想访问包含在其内的项时,才必须使用
    aq_inner
    )-结论:是的,您仍然必须使用aq_explicit等来确定值来自哪个对象。你能给我们看一下测试用例吗?