2014-04-16 62 views
0

为什么不能set_a访问MyClass实例的属性,但set_b可以吗?功能范围访问类实例

NameError: global name 'my_instance' is not defined 

代码:

#!/usr/bin/env python 

class MyClass(object): 
     a = 1 
     b = 2 

def set_a(): 
     my_instance.a = 5 
     my_instance.b = 6 

def main(): 
    def set_b(): 
      my_instance.a = 3 
      my_instance.b = 4 

    my_instance = MyClass() 
    print my_instance.a, my_instance.b 
    set_b() 
    print my_instance.a, my_instance.b 
    set_a() 
    print my_instance.a, my_instance.b 

if __name__ == "__main__": 
     main() 

回答

1

通过你的实例作为参数:

def set_a(my_a): 
     my_a.a = 5 
     my_a.b = 6 

def main(): 
    def set_b(my_a): 
      my_a.a = 3 
      my_a.b = 4 

    my_instance = MyClass() 
    print my_instance.a, my_instance.b 
    set_b(my_instance) 
    print my_instance.a, my_instance.b 
    set_a(my_instance) 
    print my_instance.a, my_instance.b 

if __name__ == "__main__": 
     main() 
0

功能set_a没有看到my_instance,因为它是在不同的范围内定义。如果将外主要被定义那么它应该工作:

my_instance = None 
... 
def set_a(): ... 
... 
def main(): ... 

虽然我会建议通过my_instance作为参数,而不是定义为全局变量。