导入一个类并使用方法python

时间:2012-08-13 06:10:09

标签: python plone python-2.4

我有这样的文件结构: 产品

-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()只是我想要做的一个简单示例。

2 个答案:

答案 0 :(得分:1)

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

  • 在静态方法上放置安全声明是没有意义的,它只适用于类方法(声明存储在类中,而不是方法中)。

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

在Plone中提供此类实用程序方法的通常的方法是使用ZCA utility registration,而不是静态方法。

答案 1 :(得分:0)

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

来掌握该工具
my_tool = getToolByName(self, tool_name)
result = my_tool.my_method()

或者您将您的功能实现为Zope实用程序,并使用getUtility()进行查找。

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