可以有2個構造函數,常規的__init__
和@classmethod
Animal.get
?Python類中的兩個構造函數
由於創建新對象的計算量很大,我們希望將先前創建的實例存儲在類屬性cls.zoo
中,如果存在,則從cls.zoo
獲取實例的緩存副本。用戶不會直接訪問Animal.zoo
。如果用戶想要獲得Animal
對象,他總是會使用Animal.get()
。
這種方法是正確的/ pythonic?
我不熟悉Singleton模式。代碼是否考慮使用Singleton模式?
class Animal:
zoo = {}
# will not be called directly from outside the class
def __init__(self, species ,age):
self.species = species
self.age = age
self.runExpensiveFunction()
# User alway use this function
@classmethod
def get(cls, species):
if species in cls.zoo:
animal = cls.zoo[species]
else:
animal = Animal(species, 0)
cls.zoo[species] = animal
return animal
tiger = Animal.get('tiger')
bear = Animal.get('bear')
如果這是你認爲工作代碼可以改進,考慮[codereview.se](雖然他們會想要實際的代碼,而不是一個虛擬的例子)。 – jonrsharpe
這是真實的代碼嗎?看起來它可能是演示/播放代碼,這對Code Review來說是無關緊要的。 – Phrancis
相反,通過類方法的替代構造函數沒有什麼問題。 – MaxNoe