在__init__中创建一个else函数

时间:2014-12-01 23:30:23

标签: python tornado

如何在if/else内的__init__内获取一个函数:

class Foo(object):
    def __init__(self, q, **keywords):
        if a == "":
            print "No empty strings"
        else:
            def on_g(self, response):
                if response.error:
                    print "Check your internet settings"
                else:
                    self.Bar()
            http_client.fetch("http://www.google.com/", self.on_g)

因为如果我放一个空字符串,程序就不会读on_g()

如果我使用on_g()外部与__init__()并行,我需要一个声明的变量,例如:

class Foo(object):
    def __init__(self, q, **keywords):
        if a == "":
            print "No empty strings"
        else:
            self.on_g()
   def on_g(self):
       print 'hello there'

将返回hello there

2 个答案:

答案 0 :(得分:5)

你的错误在

http_client.fetch("http://www.google.com/", self.on_g)

应该是

http_client.fetch("http://www.google.com/", on_g)

因为你定义了一个函数,而不是一个方法。

答案 1 :(得分:1)

self(您通过__init__创建的实例)没有on_g方法。

class的函数需要在class级别定义(如第二块代码所示)。当class首先......呃......“查找”时,会对它们进行评估? “评价”?

这就是你的第二段代码有效的原因。为什么在self.on_g方法的实际定义似乎后面的代码中,您可以在__init__内致电on_g?对于翻译来说,这是一种奇怪的行为(乍一看),对吧?好吧......那是因为当你运行self.on_g()时,整个Foo类已经过评估,on_g已添加到class(而不是instance } {!到class

class Foo(object):
   def __init__(self, q, **keywords):
       [ . . . ]
       else:
           self.on_g()      # I can use self.on_g() eventhough is defined... _
                            #                                                 |
                            #                                                 |
   def on_g(self):          # <------------ LATER  ---------------------------|
       print 'hello there'

然而,如果你在__init__中定义你的方法,翻译会对你大喊:

class Test(object):
    def __init__(self):
        def test(self):
            print "Hello"
        self.test()

a = Test()

抛出:

Traceback (most recent call last):
  File "./test.py", line 10, in <module>
    a = Test()
  File "./test.py", line 8, in __init__
    self.test()
AttributeError: 'Test' object has no attribute 'test'

即使你认为哦,也许这个类没有test方法,因为它仍然在__init__中,并且一旦初始化完成就会有它 ... Meeeck ......错了:

class Test(object):
    def __init__(self):
        def test(self):
            print "Hello"

a = Test()
a.test()

相同AttributeError

如果您仍想在运行时将on_g添加到class(非常糟糕的主意,恕我直言),您可以通过以下方式完成解释器的工作:

class Test(object):
    def __init__(self):
        def test(self):
            print "Hello"
        self.__class__.test = test
        self.test()

a = Test()
a.test()

...正确打印:

Hello
Hello

现在,我能想到的两件最直接的事情是:

  1. 您将def on_g(self)移至class级别(如您在第二个代码段中所示)
  2. 您使用http_client.fetch作为<{1>}作为{{1>}范围内的函数调用on_g(使用语言挑剔:{{ 1}}现在是函数,而不是方法,因为它不再绑定到对象了。)

    __init__