从另一个类运行Python方法时出现异常

时间:2010-10-22 13:06:47

标签: python class methods module

这是我的代码。

import urllib2
import urllib
import json
from BeautifulSoup import BeautifulSoup

class parser:
    """
    This class uses the Beautiful Soup library to scrape the information from
    the HTML source code from Google Translate.

    It also offers a way to consume the AJAX result of the translation, however
    encoding on Windows won't work well right now so it's recommended to use
    the scraping method.
    """

    def fromHtml(self, text, languageFrom, languageTo):
        """
        Returns translated text that is scraped from Google Translate's HTML
        source code.
        """
        langCode={
            "arabic":"ar", "bulgarian":"bg", "chinese":"zh-CN",
            "croatian":"hr", "czech":"cs", "danish":"da", "dutch":"nl",
            "english":"en", "finnish":"fi", "french":"fr", "german":"de",
            "greek":"el", "hindi":"hi", "italian":"it", "japanese":"ja",
            "korean":"ko", "norwegian":"no", "polish":"pl", "portugese":"pt",
            "romanian":"ro", "russian":"ru", "spanish":"es", "swedish":"sv" }

        urllib.FancyURLopener.version = "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008070400 SUSE/3.0.1-0.1 Firefox/3.0.1"

        try:
            postParameters = urllib.urlencode({"langpair":"%s|%s" %(langCode[languageFrom.lower()],langCode[languageTo.lower()]), "text":text,"ie":"UTF8", "oe":"UTF8"})
        except KeyError, error:
            print "Currently we do not support %s" %(error.args[0])
            return

        page = urllib.urlopen("http://translate.google.com/translate_t", postParameters)
        content = page.read()
        page.close()

        htmlSource = BeautifulSoup(content)
        translation = htmlSource.find('span', title=text )
        return translation.renderContents()


    def fromAjaxService(self, text, languageFrom, languageTo):
        """
        Returns a simple string translating the text from "languageFrom" to
        "LanguageTo" using Google Translate AJAX Service.
        """
        LANG={
            "arabic":"ar", "bulgarian":"bg", "chinese":"zh-CN",
            "croatian":"hr", "czech":"cs", "danish":"da", "dutch":"nl",
            "english":"en", "finnish":"fi", "french":"fr", "german":"de",
            "greek":"el", "hindi":"hi", "italian":"it", "japanese":"ja",
            "korean":"ko", "norwegian":"no", "polish":"pl", "portugese":"pt",
            "romanian":"ro", "russian":"ru", "spanish":"es", "swedish":"sv" }

        base_url='http://ajax.googleapis.com/ajax/services/language/translate?'
        langpair='%s|%s'%(LANG.get(languageFrom.lower(),languageFrom),
                          LANG.get(languageTo.lower(),languageTo))
        params=urllib.urlencode( (('v',1.0),
                           ('q',text.encode('utf-8')),
                           ('langpair',langpair),) )
        url=base_url+params
        content=urllib2.urlopen(url).read()
        try: trans_dict=json.loads(content)
        except AttributeError:
            try: trans_dict=json.load(content)
            except AttributeError: trans_dict=json.read(content)
        return trans_dict['responseData']['translatedText']

现在在另一个名为TestingGrounds.py的类中,我想尝试两种方法,但是我收到以下错误:

from Parser import parser

print parser.fromHtml("Hello my lady!", "English", "Italian")

回溯(最近一次调用最后一次):文件“C:\ Users \ Sergio.Tapia \ Documents \ NetBeansProjects \ BabylonPython \ src \ TestingGrounds.py”,第3行,     print parser.fromHtml(“Hello my lady!”,“English”,“Italian”)TypeError:必须使用解析器实例作为第一个参数调用fromHtml()的未绑定方法(改为使用str实例)

2 个答案:

答案 0 :(得分:1)

您必须拥有parser类的实例,而不是在类本身上调用该方法。

from Parser import parser

print parser().fromHTML("Hello my lady!", "English", "Italian")

from Parser import parser

p = parser()
p.fromHTML(...)

或者,您可以将fromHTML设为静态方法:

class parser(object):   # you should probably use new-style classes
    ...
    @staticmethod
    def fromHTML(...):
        ...
然后你可以使用

from Parser import parser

print parser.fromHTML(...)

答案 1 :(得分:0)

如果你想使用fromHtml()作为静态方法,如果你真的不需要访问解析器中的任何datamembers,那么你需要这样做(为简洁起见)

class parser:
    @staticmethod
    def fromHtml(text, languageFrom, languageTo):
         # etc.

或者,如果您希望它既是静态方法又能够成为实例方法......

class parser:
    @classmethod
    def fromHtml(self, text, languageFrom, languageTo):
         # etc.

您现在可以将其用作parser.fromHtml()parser().fromHtml()

查看您的代码,我认为您只需要一个静态方法。