python 共享全局變量


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中,拿到了隊列實例的地址,也拿到了修改后的內容


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM