簡體   English   中英

如何一次實例化一個對象

[英]How to instantiate an object once

每當我在函數中調用csv時,我都會在下面實例化此對象。 只是想知道是否仍然可以將對象實例化一次? 我試圖將返回的csv從def csv()拆分到另一個函數,但是失敗了。

實例化對象的代碼

def csv():

    proj = Project.Project(db_name='test', json_file="/home/qingyong/workspace/Project/src/json_files/sys_setup.json")#, _id='poc_1'
    csv = CSVDatasource(proj, "/home/qingyong/workspace/Project/src/json_files/data_setup.json")
    return csv

測試功能

def test_df(csv,df)

..............

您的csv函數實際上是pytest.fixture嗎? 如果是這樣,您可以將其作用域更改為session以便每個py.test會話僅調用一次。

@pytest.fixture(scope="session")
def csv():
    # rest of code

當然,返回的數據應該是不變的,因此測試不會相互影響。

您可以使用全局變量來緩存對象:

_csv = None

def csv():
    global _csv
    if _csv is None:
        proj = Project.Project(db_name='test', json_file="/home/qingyong/workspace/Project/src/json_files/sys_setup.json")#, _id='poc_1'
        _csv = CSVDatasource(proj, "/home/qingyong/workspace/Project/src/json_files/data_setup.json")
    return _csv

另一個選擇是更改調用方以類似於上面的代碼片段的方式緩存csv()的結果。

請注意,您的“調用該函數的代碼”不會調用該函數,它僅聲明另一個顯然接收csv函數返回值的函數。 您沒有顯示實際調用該函數的調用。

如果CSVDatasource沒有副作用(例如逐行讀取輸入),則可以為此使用裝飾器。

請參見使函數僅在循環中執行一次的有效方法

您可以將對象存儲在函數的本地字典中。 並返回該對象(如果存在),如果不存在則創建一個新對象。

def csv():
    if not hasattr(csv, 'obj'):
        proj = Project.Project(db_name='test', json_file="/home/qingyong/workspace/Project/src/json_files/sys_setup.json")#, _id='poc_1'
        csv.obj = CSVDatasource(proj, "/home/qingyong/workspace/Project/src/json_files/data_setup.json")
    return csv.obj

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM