![](/img/trans.png)
[英]Python: Is there a way of knowing whether an instance of a class has been assigned to a variable?
[英]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.