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 では、I Tool がこのクラス メソッドにアクセスするので、次のようにしました。

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() は、私がやろうとしていることの単なる例です。

4

2 に答える 2

1
  • 例でタイプミスをした可能性があります。正しいスペルは@staticmethod、ではなく、@staticclassです。後者は名前エラーを生成するため、すでにそれを知っていると確信しています。:-)

  • 静的メソッドにセキュリティ宣言を配置しても意味がありません。これは、クラス メソッドにのみ適用されます (宣言はメソッドではなくクラスに格納されます)。

  • デコレーターは、その下の関数定義ではなく、セキュリティ宣言行の結果に適用されています。つまり、Noneクラスに静的メソッドが作成されました。

Plone でそのようなユーティリティ メソッドを提供する通常の方法は、静的メソッドではなく、ZCA ユーティリティ登録を使用することです。

于 2012-08-13T07:42:44.410 に答える
0

上記のアプローチは奇妙に見えます。ツールは PropertyManager、UniqueObject、SimpleItem を基本クラスとして使用します。これは、ツールが永続オブジェクトであることを意味します。だからあなたはツールを手に入れたい

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

または、機能を Zope ユーティリティとして実装し、getUtility() を使用して検索します。

ただし、永続的なツールを作成してから、そのツールを重要視しようとしてもあまり意味がありません。あなたのコードが永続オブジェクトを扱わないか、Zope や Plone のコア機能を考慮していない単なるユーティリティ メソッドである場合: 上記の基底クラスを持たない「通常の」クラスにして、実行しようとしているものをインポートします。

于 2012-08-13T08:34:57.623 に答える