2017-04-20 36 views
0

我有下面的代碼:獲得通過的「自我」變量名類的方法內部在Python

class A: 
    def m(self): 
     print(...) # 'my_var' should be printed 

my_var = A() 
my_var.m() 

我的m內輸入輸出什麼樣的代碼創建的變量的名稱?我需要針對Python 3的解決方案。

+1

我不認爲這是可能的,或者至少它不應該是可能的。一個函數不需要知道這一點。爲什麼你可能需要這個? – Carcigenicate

+0

對象不知道在任何給定時間碰巧綁定了哪些名稱空間。你可以掃描該對象的加載模塊,這會吸引一些。但它不會捕獲任何活動的函數名稱空間或容納該對象的容器對象。這足夠嗎? – tdelaney

+0

如果我做'a = b = c = A()'或'a = A(); def f():b = a'或'A()。m()'? –

回答

1

對象不知道在任何給定時間它們碰巧綁定了哪些名稱空間變量。這些變量具有對該對象的前向引用,但該對象不保留對潛在許多變量的反向引用。導入的模塊列在sys.modules中,您可以掃描那些用於您的對象的模塊。這將捕獲模塊級別的變量,但不會捕獲碰巧也包含該變量的任何容器,類,類實例或本地函數名稱空間。

test1.py - 實現類中已知的模塊

import sys 

class A: 

    def m(self): 
     for name, module in sys.modules.items(): 
      try: 
       for varname, obj in module.__dict__.items(): 
        if obj is self: 
         print('{}.{}'.format(name, varname)) 
      except AttributeError: 
       pass 

a = A() 

test2.py掃描本身 - 測試代碼

import test1 

my_a = test1.a 
my_a.m() 

運行代碼

$ python3 test2.py 
__main__.my_a 
test1.a 
+0

謝謝,它的工作。我期望使用'sys.modules'或'inspect'這樣的解決方案。我理解與我的問題有關的所有問題以及它不應該成爲可能的哲學。 – Fomalhaut

相關問題