標籤:item 構造 有一個 ret 需要 重載函數 int hash shuffle
物件導向進階(1)
# 設計模式 # 23種 # 單例模式 # 限制一個類在程式開始到結束始終只有一個對象執行個體 # 當你第一次執行個體化這個類的時候,就建立一個執行個體化的對象,但是當你之後再執行個體化的時候還是就用之前建立的對象# 實現單例模式,主要用__new__方法,因為__new__是執行個體化時被第一個啟動並執行函數class A: __instance = False def __init__(self, name, age): # 為__new__建立的對象進行增加屬性,還是覺得相當於建構函式 self.name = name self.age = age def __new__(cls, *args, **kwargs): # 創造對應類的對象方法,執行個體化時最先調用的 if cls.__instance: # 如果為True,表示建立過對象,則直接返回這個對象,不在建立 return cls.__instance else: cls.__instance = object.__new__(cls) # 建立一個cls類的對象,返回給cls.__instance return cls.__instance # 返回cls.__instance對象egon = A(‘egg‘, 25)nezha = A(‘nazha‘, 21)print(egon) # <__main__.A object at 0x00000238A56F30B8>print(nezha) # <__main__.A object at 0x00000238A56F30B8>print(nezha.name) # nazhaprint(egon.name) # nazha# __eq__ ==的操作符重載函數,不實現預設比較的是記憶體位址class A: def __init__(self, name): self.name = name def __eq__(self, other): # 當不實現這個內建方法時,obj1和obj2比較的是記憶體位址,實現後相當於重載了==,根據自己的情況去寫。==的操作符重載函數 #return self == other # 比較的是記憶體位址 if self.name == other.name: return True else: return Falseobj1 = A(‘egg‘)obj2 = A(‘egg‘)print(obj1)print(obj2)print(obj1 == obj2)# __hash__class A: def __init__(self, name): self.name = namea = A(‘why‘)b = A(‘why‘)print(hash(a)) # 預設是根據a對象的記憶體位址進行雜湊的print(hash(b))class A: def __init__(self, name, sex): self.name = name self.sex = sex def __hash__(self): # 如果想要hash一個對象,不想根據對象的記憶體位址去進行hash,則需要自己去實現一個內建的__hash__方法,不實現,hash對象時預設是對對象的記憶體位址進行hash return hash(self.name + self.sex)a = A(‘why‘, ‘12‘)b = A(‘why‘, ‘12‘)print(hash(a)) # 預設是根據a對象的記憶體位址進行雜湊的print(hash(b))# 紙牌遊戲例子from collections import namedtupleimport jsonCard = namedtuple(‘Card‘, [‘rank‘, ‘suit‘])class FranchDeck: ranks = [str(n) for n in range(2, 11)] + list(‘JQKA‘) suits = [‘紅心‘, ‘方板‘, ‘梅花‘, ‘黑桃‘] def __init__(self): self.__cards = [Card(rank, suit) for rank in FranchDeck.ranks for suit in FranchDeck.suits] def __len__(self): return len(self.__cards) def __getitem__(self, item): return self.__cards[item] def __setitem__(self, key, value): self.__cards[key] = value def __str__(self): # 必須返回str類型的,所以需要序列化 return json.dumps(self.__cards, ensure_ascii=False) # json序列化(轉為字串),返回deck = FranchDeck()print(deck[0]) # 得益於對象實現的__getitem__方法from random import choice # 抽取,隨機從對象中抽取,抽取的對象必須有len方法,依賴__len__方法,所抽取的對象必須有__len__方法print(choice(deck)) # 抽牌from random import shuffle # 打亂順序,依賴於__setitem__方法,所打亂的對象必須有__setitem__方法shuffle(deck) # 洗牌print(deck) # 得益於__str__,將所有的牌列印了出來,列印self.__cards列表print(deck[:5])# set集合 依賴對象的 hash和eq, set(對象時),目的為了去重,依賴於hash和eq,需重新實現eq和hash
物件導向進階