簡體   English   中英

檢查是否定義了類變量

[英]Check whether class variable has been defined

我正在處理我有python類Foo的情況。 Foo進行了許多重要的計算,除非有必要,否則我不會這樣做。 因此,當我為這些大型計算之一定義getter方法時,如何確保與該計算相對應的方法(在這里為bigcalculation())已經運行?

class Foo:
    def __init__(self):
        #initialize some stuff
    def bigcalculation(self):
         #perform calculation
         self.big_calc_result=[big list of numbers];

    def get_big_calc_result(self):
        if hasattr(self,'big_calc_result')==False:
            self.bigcalculations();
        return sef.big_calc_result;

如果它一次運行,我不希望它再次運行。 而且我不希望呼叫者必須跟蹤它是否運行過一次。

現在,我使用上述的hasattr()函數來執行此操作,但是我認為這是一種非常難看的方法。 有沒有更優雅的pythonic方式來做到這一點?

我可以想到的另一種方法是,在我的init ()函數中,將我將在類中使用過的所有變量定義為空列表。 然后檢查big_calc_result是否為空列表,以確定self.bigcalculation()是否已運行。 這是更好的方法嗎?

相關問題:Python讓我可以在類中動態定義變量。 但是那是不好的編程習慣嗎?

編輯:回想起來,我還發現使用異常也可以是處理這種情況的另一種方法。 那可能是更Python化的做事方式。

def get_big_calc_result(self):
    try:
        return self.big_calc_result;
    except AttributeError:
        self.bigcalculations();
        return self.big_calc_result;

這個問題的答案很有用: 在Python中檢查成員是否存在

您可以記住結果並將其存儲為屬性:

class Foo(object):
    def __init__(self):
        self._big_calc_result = None

    @property
    def big_calc_result(self):
        if self._big_calc_result is not None:
            return self._big_calc_result
        else:
            self._big_calc_result = self.big_calc_run()
            return self._big_calc_result 

    def big_calc_run(self):
        time.sleep(10)  # Takes a long time ...

現在,您只需初始化類並獲得結果:

f = Foo()
x = f.big_calc_result
y = f.bic_calc_result  # Look mom, this happened really quick

當然,如果該屬性不太直觀,則不必使用屬性,您可以在此處更改內容以適合您要提供的API。 真正的訣竅是將結果緩存在帶下划線的變量中,下划線是:“這是一個實現細節-如果您將其弄亂了,則值得在將來的某個時候中斷代碼”。

暫無
暫無

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

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