版權聲明
- 本文原創作者:谷哥的小弟
- 作者博客地址: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)