2014-04-16 65 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作爲參數,而不是定義爲全局變量。