用 Classmethod 自定義創(chuàng)建對(duì)象的方式
這里分享一下 classmethod 的實(shí)用小技巧。
classmethod 是一個(gè)非常實(shí)用的裝飾器,可以用它來(lái)改變類創(chuàng)建對(duì)象的形為,比如說(shuō)這樣一段代碼:
class Pet:
def __init__(self, name):
self.name = name
傳入一個(gè) name,初始化一個(gè) Pet 對(duì)象,如果你覺(jué)得這太單調(diào)了,想實(shí)現(xiàn)非常個(gè)性的初始化方法,那么可以修改 __init__ 函數(shù)的代碼。
但是,有些情況你不能修改 __init__? 函數(shù)的代碼,比如代碼已經(jīng)運(yùn)行很久了,有很多地方調(diào)用了 Pet 的 __init__ 方法,如果直接修改,可能會(huì)產(chǎn)生很多問(wèn)題。
這時(shí)候就可以借助于裝飾器 classmethod,自定義對(duì)象的創(chuàng)建方式:
import random
class Pet:
def __init__(self, name):
self.name = name
@classmethod
def create(cls):
number = random.randint(100_000,999_999)
return cls(f"Pet_{number}")
然后,可以這樣調(diào)用,輸出結(jié)果在注釋里。
dog = Pet("Dog")
print(dog.name)
# Dog
pet = Pet.create()
print(pet.name)
# Pet_444383
print(isinstance(dog, Pet))
# True
print(isinstance(pet, Pet))
# True
此外,標(biāo)準(zhǔn)庫(kù)里也有很多使用 classmethod 的例子,比如 dict.fromkeys 就是一個(gè)例子:
>>> dict.fromkeys("ABC", 0)
{'A': 0, 'B': 0, 'C': 0}
>>> dict.fromkeys(["hello","world"])
{'hello': None, 'world': None}