Python 将函数作为_init中的else__

Python 将函数作为_init中的else__,python,tornado,Python,Tornado,如何在\uuuu init\uuuu中获取if/else中的函数: class Foo(object): def __init__(self, q, **keywords): if a == "": print "No empty strings" else: def on_g(self, response): if response.error:

如何在
\uuuu init\uuuu
中获取
if/else
中的函数:

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)
因为如果我输入一个空字符串,程序就不会读取\u g()上的

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

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'
将返回您的bug所在的位置

http_client.fetch("http://www.google.com/", self.on_g)
应该是哪一个

http_client.fetch("http://www.google.com/", on_g)
因为您定义的是函数,而不是方法。

您的错误在

http_client.fetch("http://www.google.com/", self.on_g)
应该是哪一个

http_client.fetch("http://www.google.com/", on_g)
因为您定义的是一个函数,而不是一个方法。

self
(您通过
\uuuu init\uuuu
创建的实例)没有
on\u g
方法

-es的函数需要在
级别定义(如第二段代码所示)。当
第一次出现时,将对其进行评估。。。嗯。。。“向上看”?“评估”

这就是为什么你的第二段代码是有效的。当
on\g
方法的实际定义似乎在代码的后面出现时,您为什么可以在
中调用
self.on\g
?这对口译员来说是一种奇怪的行为(乍一看),对吗?好。。。这是因为当您运行
self.on_g()
时,整个
Foo
类已经被评估,并且
on_g
已经被添加到
类中(而不是添加到
实例中
!:添加到
类中

抛出:

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'
相同的
属性错误

如果您仍然希望在运行时将
添加到
(非常糟糕的主意,IMHO),您可以通过执行以下操作来完成解释器的工作:

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

a = Test()
a.test()
。。。正确打印:

Hello
Hello
现在,我能想到的两件最简单的事情是:

  • 将(self)
  • 上的
    def移动到
    级别(如第二个代码段所示)
  • 调用您的
    http\u客户端。在
    上使用
    作为
    \uuuu init\uuuu
    作用域的本地函数获取
    (挑剔语言:
    on\ug
    现在是一个函数,而不是一个方法,因为它不再绑定到对象)

  • self
    (您通过
    \uuuu init\uuuu
    创建的实例)没有
    on\g
    方法

    -es的函数需要在
    级别定义(如第二段代码所示)。当
    第一次出现时,将对其进行评估。。。嗯。。。“向上看”?“评估”

    这就是为什么你的第二段代码是有效的。当
    on\g
    方法的实际定义似乎在代码的后面出现时,您为什么可以在
    中调用
    self.on\g
    ?这对口译员来说是一种奇怪的行为(乍一看),对吗?好。。。这是因为当您运行
    self.on_g()
    时,整个
    Foo
    类已经被评估,并且
    on_g
    已经被添加到
    类中(而不是添加到
    实例中
    !:添加到
    类中

    抛出:

    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'
    
    相同的
    属性错误

    如果您仍然希望在运行时将
    添加到
    (非常糟糕的主意,IMHO),您可以通过执行以下操作来完成解释器的工作:

    class Test(object):
        def __init__(self):
            def test(self):
                print "Hello"
            self.__class__.test = test
            self.test()
    
    a = Test()
    a.test()
    
    。。。正确打印:

    Hello
    Hello
    
    现在,我能想到的两件最简单的事情是:

  • 将(self)
  • 上的
    def移动到
    级别(如第二个代码段所示)
  • 调用您的
    http\u客户端。在
    上使用
    作为
    \uuuu init\uuuu
    作用域的本地函数获取
    (挑剔语言:
    on\ug
    现在是一个函数,而不是一个方法,因为它不再绑定到对象)


  • 什么是
    a
    ?id似乎没有在任何地方声明。
    a
    已声明,但问题是当我使用
    回调
    系统时,它不想进入else。什么是
    a
    ?id似乎没有在任何地方声明。
    a
    已声明,但问题是当我使用
    回调
    系统时,它不想进入else。您应该提到,他们还需要从
    上的
    arg中删除
    self
    ,我将如何使用第二个代码(在问题中)要避免未声明
    响应
    ?因为单独使用,它将很好地工作,并获取您应该提到的
    google
    ,他们还需要从_g
    argspec上的
    中删除
    self
    ,我如何使用第二个代码(在问题中)来避免
    响应
    未声明?因为单靠它,它就可以很好地工作,并获取
    google
    啊,我想现在OOP对我来说不再是一种魔法了!非常感谢。没问题。。。谢谢你考虑这个被接受的答案,但是要准备好:一旦你开始处理OOP,你肯定会发现很多新的东西。有趣的东西!!:-D(是的,非常有趣)享受!!啊,我想现在OOP对我来说不再是魔术了!非常感谢。没问题。。。谢谢你考虑这个被接受的答案,但是要准备好:一旦你开始处理OOP,你肯定会发现很多新的东西。有趣的东西!!:-D(是的,非常有趣)享受!!