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 中,我 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 回答