Python基礎核心教程(031)——單例模式


版權聲明

  • 本文原創作者:谷哥的小弟
  • 作者博客地址:http://blog.csdn.net/lfdfhl

_ _ new _ _ 與_ _ init _ _

當我們使用類名( )創建對象時,Python解釋器首先調用 _ _ new _ _方法爲對象分配空間。

__new__(cls, *args, **kwargs)

該方法第一個參數cls代表調用該方法的類對象。

_ _ new _ _是由object基類提供的內置方法,主要作用爲:

  • 1、在內存中爲對象分配空間
  • 2、返回新建對象的引用

默認情況下,當Python解釋器獲得新建對象的引後,將該引用作爲參數傳遞給 _ _ init _ 方法。所以,假若我們自己重寫了類的 _ new _ _ 方法一定要在該方法中創建實例對象並將其傳遞給_ _ init _ 方法;否則 _ init _ _方法不會執行。

_ _ init _ _是由object基類提供的內置方法,主要作用爲:

  • 1、初始化對象
  • 2、定義實例屬性

至此,我們要注意和區分 _ _ new _ _ 與_ _ init _ 的不同作用: _ _ new _ _ 負責創建對象並返回對象的引用; _ init _ _負責實例化對象和定義實例屬性。

示例如下:

"""
原創作者:谷哥的小弟
博客地址:http://blog.csdn.net/lfdfhl
示例描述:面向對象——__new__與__init__
"""


# 定義學生類
class Student:
    def __new__(cls, *args, **kwargs):
        print("執行__new__方法")
        # 創建實例
        instance = super().__new__(cls)
        # 返回實例
        return instance

    def __init__(self, name):
        print("執行__init__方法")
        self.name = name

    def printHello(self):
        print("Hello,My name is %s" % self.name)


# 創建對象
student = Student("lucy")
student.printHello()

在這裏插入圖片描述

單例模式

所謂單例模式,即通過一個類只能創建一個實例。

"""
原創作者:谷哥的小弟
博客地址:http://blog.csdn.net/lfdfhl
示例描述:面向對象——單例模式
"""


# 定義電話簿類
class PhoneBook:
    # 類屬性
    phoneBookInstance = None
    # 類屬性
    initFlag = False

    def __new__(cls, *args, **kwargs):
        print("執行__new__方法")
        # 判斷類屬性phoneBookInstance是否爲None
        if cls.phoneBookInstance is None:
            # 創建對象並將該對象賦值給類屬性phoneBookInstance
            cls.phoneBookInstance = super().__new__(cls)
        return cls.phoneBookInstance

    def __init__(self, name):
        print("執行__init__方法")
        # 判斷是否已經執行過__init__方法
        if PhoneBook.initFlag:
            return
        print("初始化電話簿")
        self.name = name
        # 修改類屬性initFlag
        PhoneBook.initFlag = True


p1 = PhoneBook("手機電話簿")
print(p1)

p2 = PhoneBook("手機電話簿")
print(p2)

p3 = PhoneBook("手機電話簿")
print(p3)

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章