如何在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
答案 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
现在,我能想到的两件最直接的事情是:
def on_g(self)
移至class
级别(如您在第二个代码段中所示)您使用http_client.fetch
作为<{1>}作为{{1>}范围内的函数调用on_g
(使用语言挑剔:{{ 1}}现在是函数,而不是方法,因为它不再绑定到对象了。)
__init__