物件導向進階

來源:互聯網
上載者:User

標籤: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

 

物件導向進階

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.