导入一个类并使用python方法

2024-09-28 21:52:00 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

在工具.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()

在内容.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\ u lower方法没有定义。 注意:convert \u to \u lower()只是一个简单的例子。你知道吗


Tags: to方法frompyimportconvertdatadef
2条回答

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

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

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

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

  • 您可能在示例中输入了一个拼写错误;正确的拼写应该是@staticmethod,而不是@staticclass。因为后者会产生一个名字错误,我相信你已经知道了。:-)

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

  • 修饰符应用于安全声明行的结果,而不是它下面的函数定义。换句话说,现在类上有了一个None静态方法。

在Plone中提供这种实用方法的通常方法是使用ZCA utility registration,而不是静态方法。你知道吗

相关问题 更多 >