python - making a function as an else inside an __init__ -
how function inside if/else inside __init__ :
class foo(object): def __init__(self, q, **keywords): if == "": print "no empty strings" else: def on_g(self, response): if response.error: print "check internet settings" else: self.bar() http_client.fetch("http://www.google.com/", self.on_g) because program dont read on_g() if put empty string!
if use on_g() outside in parallel __init__() need declared variable, example:
class foo(object): def __init__(self, q, **keywords): if == "": print "no empty strings" else: self.on_g() def on_g(self): print 'hello there' will return hello there
self (the instance you're creating through __init__ ) doesn't have on_g method.
functions class-es need defined @ class level (as shown on second chunk of code). evaluated when class first... erm... "looked-up"? "evaluated"?
that's why second piece of code works. how come can call self.on_g within __init__ when actual definition of on_g method seems come later in code? it's odd behavior (at first glance) interpreter, right? well... that's because when run self.on_g(), whole foo class has been evaluated , on_g has been added class (not instance!: class)
class foo(object): def __init__(self, q, **keywords): [ . . . ] else: self.on_g() # can use self.on_g() eventhough defined... _ # | # | def on_g(self): # <------------ later ---------------------------| print 'hello there' whereas if define method within __init__, interpreter yell @ you:
class test(object): def __init__(self): def test(self): print "hello" self.test() = test() throws:
traceback (most recent call last): file "./test.py", line 10, in <module> = test() file "./test.py", line 8, in __init__ self.test() attributeerror: 'test' object has no attribute 'test' even if think oh, maybe class doesn't have test method because it's still within __init__, , have once initialization completed... meeeck... wrong:
class test(object): def __init__(self): def test(self): print "hello" = test() a.test() same attributeerror.
if still want add on_g class @ runtime (very bad idea, imho) can interpreter's job doing this:
class test(object): def __init__(self): def test(self): print "hello" self.__class__.test = test self.test() = test() a.test() ... correctly prints:
hello hello now, 2 straightforward things can think of are:
- you move
def on_g(self)classlevel (as showed in second code snippet) you call
http_client.fetchon_gfunction local__init__'s scope (being picky language:on_gfunction, not method, since not bound object anymore).def __init__(self, q, **keywords): if == "": print "no empty strings" else: def on_g(response): if response.error: print "check internet settings" else: self.bar() http_client.fetch("http://www.google.com/", on_g)
Comments
Post a Comment