我有下面的代碼:獲得通過的「自我」變量名類的方法內部在Python
class A:
def m(self):
print(...) # 'my_var' should be printed
my_var = A()
my_var.m()
我的m
內輸入輸出什麼樣的代碼創建的變量的名稱?我需要針對Python 3的解決方案。
我有下面的代碼:獲得通過的「自我」變量名類的方法內部在Python
class A:
def m(self):
print(...) # 'my_var' should be printed
my_var = A()
my_var.m()
我的m
內輸入輸出什麼樣的代碼創建的變量的名稱?我需要針對Python 3的解決方案。
對象不知道在任何給定時間它們碰巧綁定了哪些名稱空間變量。這些變量具有對該對象的前向引用,但該對象不保留對潛在許多變量的反向引用。導入的模塊列在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
謝謝,它的工作。我期望使用'sys.modules'或'inspect'這樣的解決方案。我理解與我的問題有關的所有問題以及它不應該成爲可能的哲學。 – Fomalhaut
我不認爲這是可能的,或者至少它不應該是可能的。一個函數不需要知道這一點。爲什麼你可能需要這個? – Carcigenicate
對象不知道在任何給定時間碰巧綁定了哪些名稱空間。你可以掃描該對象的加載模塊,這會吸引一些。但它不會捕獲任何活動的函數名稱空間或容納該對象的容器對象。這足夠嗎? – tdelaney
如果我做'a = b = c = A()'或'a = A(); def f():b = a'或'A()。m()'? –