2012-08-13 58 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功能的實用方法:將它作爲一個「普通」類,沒有上面的基類,然後導入它們,你試圖去做。