0X01 場景
最近幾次遇到下面場景:
函數調用關系 A->B->C->D->E->F->G
G處需要一個X數據,但這個X數據只有A處出現過,中間過程由於某種原因難以修改 (比如 中間某一階段程序外其他人員寫的幾百個插件,在模板設立之初就沒有考慮傳遞該數據,改模板意味着要改幾百個插件)
0X02 將數據傳入類本身里
這里並不是指類的實例,而是在A截斷就將數據傳入G調用的類里。
每個類相當於一個模板,在進程開啟的時候,只存一份在內存中。
將數據直接懟到類里作為一個屬性,就可以實現在A處跳着直接傳數據給G。
0X03 更簡單通用的方法
0X02中使用的類其實是使用了其可變對象存的是指針的特點。
如此可以另起一個文件,用於存儲一個可變對象,可以是:
隊列
字典
類
類對象
之后在文件A處引用並改動 (傳入數據),在G處引用拿出數據就好了。
0X04 實例
__init__.py
my_class.py
my_test_1.py
my_test_2.py
# my_class.py
MyConf = "NULL"
MyAAA = []
class MyCl:
my_param = ""
def __init__(self):
pass
# my_test_1.py
""" 如果在程序開頭設置一個類的變量,在其他地方能調用么 """
from sqlmap_qps_test.my_test_2 import func_two
from sqlmap_qps_test.my_class import MyCl, MyAAA
from sqlmap_qps_test.my_class import MyConf
import sqlmap_qps_test
MyCl.my_param = "1"
MyCl()
sqlmap_qps_test.MyConf = "2"
MyAAA.append("3")
func_two()
# my_test_2.py
def func_two():
from sqlmap_qps_test.my_class import MyCl
mm = MyCl()
print(mm.my_param)
from sqlmap_qps_test.my_class import MyConf
print(MyConf)
import sqlmap_qps_test
print(sqlmap_qps_test.MyConf)
from sqlmap_qps_test.my_class import MyAAA
print(MyAAA)
運行my_test_1.py結果
1
NULL
2
['3']
第一行 mm.my_param 為 1,被修改
在test_1中,1被傳入作為類的屬性,所以在test_2中,屬性調用拿到這個1
第二行 MyConf 為NULL,無改動
在test_1中,修改了 sqlmap_qps_test這個文件(指針存在)里的MyConf;在test_2中,引入了MyConf,直接傳入一個字符串,另外一個地址,而不是sqlmap_qps_test文件指向的屬性。
所以之間修改互不影響
第三行 sqlmap_qps_test.MyConf.MyConf,被修改
在test_1中,修改了 sqlmap_qps_test這個文件(指針存在)里的MyConf;test_2調用拿到了文件地址指向的MyConf
第四行 隊列 MyAAA ,被修改
在test_1中,修改了隊列實例;在test_2中,拿到了隊列實例的地址,也拿到了修改后的內容