2012-08-13 102 views
0

我有一个文件的结构是这样的: 产品导入类和使用方法蟒蛇

-product 
    - content 
    - MyContent.py 
    - Tool.py 

在Tool.py,我有

from AccessControl import ClassSecurityInfo 
from OFS.SimpleItem import SimpleItem 
from Products.CMFCore.utils import UniqueObject 

class Tool(PropertyManager, UniqueObject, SimpleItem): 

    @staticmethod 
    security.declarePublic('convert_to_lower') 
    def convert_to_lower(data): 
     return data.lower() 

在MyContent.py,我访问工具这种方法,所以我做了:所以我做了:

from Product.Tool import Tool 
from Product.Content.ATContentTypes.content.base import ATCTContent 
class MyContent(BaseContent): 
     def new_definition(self): 
      print Tool.convert_to_lower("ABCD") 

我似乎无法找到我在这里做错了。我实例为myContent与对象:

mycontent = MyContent() 
mycontent.new_definition() 

但是,当我运行它,它给了我错误说,该方法convert_to_lower没有定义。 注意:convert_to_lower()只是我想要做的一个简单示例。

回答

1
  • 你可能在你的例子中犯了一个错字;正确的拼写为@staticmethod,而不是@staticclass。由于后者会产生名称错误,我相信你已经知道了。 :-)

  • 对静态方法进行安全声明是没有意义的,这只适用于类方法(声明存储在类中,而不是方法)。

  • 装饰器正在应用于安全声明行的结果,而不是其下面的函数定义。换句话说,你现在有一个None静态方法在你的课堂上。

通常方式在Plone提供这样的实用方法是使用ZCA utility registration虽然,而不是一个静态方法。

+0

@staticclass是我的错误,在我自己的情况下,我把它作为@staticmethod! – 2012-08-13 08:37:09

+0

我不明白为什么我们需要创建2个接口,我应该在哪里存储这个文件的接口。从客户端提取它时,我只需要ILanguagePreference,那么为什么需要创建另一个名为ILanguage的接口,并且我还注意到这个ILanguage被用作第二个接口的模式。你能向我解释吗?我能否只使用称为ILanguagePreference的单一接口,如果我这样做,我应该在模式中放置什么? – 2012-08-13 12:17:54

0

上面的方法看起来很奇怪。您的工具使用PropertyManager,UniqueObject,SimpleItem作为基类 - 这意味着您的工具是一个持久对象。所以,你要使用

my_tool = getToolByName(self, tool_name) 
result = my_tool.my_method() 

获得该工具的持有或你实现你的功能一个Zope效用和使用getUtility看看它()。

但是,编写一个持久工具,然后尝试只是重要的工具没有多大意义。如果你的代码没有处理持久化对象,或者只是一个没有考虑核心Zope或Plone功能的实用方法:将它作为一个“普通”类,没有上面的基类,然后导入它们,你试图去做。