面向对象进阶------内置函数 str repr new call 方法
__new__方法:
我們來講個非常非常重要的內置函數和init一樣重要__new__其實在實例話對象的開始? 是先繼承父類中的new方法再執行init的? 就好比你生孩子 先要把孩子生出來才能對孩子穿衣服的? new就是生孩子 init是給孩子穿衣服
new()是在新式類中新出現的方法,它作用在構造方法init()建造實例之前,可以這么理解,在Python 中存在于類里面的構造方法init()負責將類的實例化,而在init()調用之前,new()決定是否要使用該init()方法,因為new()可以調用其他類的構造方法或者直接返回別的對象來作為本類 的實例。?
如果將類比喻為工廠,那么init()方法則是該工廠的生產工人,init()方法接受的初始化參 數則是生產所需原料,init()方法會按照方法中的語句負責將原料加工成實例以供工廠出貨。而?new()則是生產部經理,new()方法可以決定是否將原料提供給該生產部工人,同時它還決定著出 貨產品是否為該生產部的產品,因為這名經理可以借該工廠的名義向客戶出售完全不是該工廠的產品。?
new()方法的特性:?
new()方法是在類準備將自身實例化時調用。?
new()方法始終都是類的靜態方法,即使沒有被加上靜態方法裝飾器。
而在實例化開始之后,在調用?init()方法之前,Python首先調用new()方法:
如果以建房子做比喻,new()方法負責開發地皮,打下地基,并將原料存放在工地。而init()方法負責從工地取材料建造出地皮開發招標書中規定的大樓,init()負責大樓的細節設計,建造,裝修使其可交付給客戶。
在新式類中new()才是真正的實例化方法
?
內置方法 必須能看懂 能用盡量用
__len__ len(obj)的結果依賴于obj.__len__()的結果,計算對象的長度
__hash__ hash(obj)的結果依賴于obj.__hash__()的結果,計算對象的hash值
__eq__ obj1 == obj2 的結果依賴于obj.__eq__()的結果,用來判斷值相等
__str__ str(obj) print(obj) '%s'%obj 的結果依賴于__str__,用來做輸出、顯示
__repr__ repr(obj) '%r'%obj的結果依賴于__repr__,還可以做str的備胎
__format__ format() 的結果依賴于__format__的結果,是對象格式化的
__call__ obj()相當于調用__call__,實現了__call__的對象是callable的
__new__ 構造方法,在執行__init__之前執行,負責創建一個對象,在單例模式中有具體的應用
__del__ 析構方法,在對象刪除的時候,刪除這個對象之前執行,主要用來關閉在對象中打開的系統的資源
_str__和__repr__方法:
來講一下類中經常用到的 內置函數? __str__和__repr__方法
我個人理解? __repr__是比__str__方法功能更加強大的 一個方法? 能讓你使用的更加廣泛? ?str就是你在打印你實例的對象的時候你所對類中str方法返回的內容會被輸出
__str__和__repr__方法一樣它不能用print直接輸出 必須用return來返回? 然后返回的也必須是字符串類型的?
class List:def __init__(self, *args):self.l = list(args)# def __str__(self):# return'[%s]' %(','.join([str(i) for i in self.l])) #把你傳遞進來的 迭代對象中的信息中的元素都轉化為字符串類型的 然后把 信息再給轉化為列表的額形式輸出def __str__(self): #__str__類型的必須是要用return來返回的 并且返回值也必須是字符串類型的return 'niha' l = List(1, 2, 3, 4) print(l)當需要使用__str__的場景時找不到 __str__就找__repr__當需要使用__repr__的場景時找不到__repr__的時候就找父類的repr雙下repr是雙下str的備胎
當你的語句中同時出現 str? 和repr的時候一定會執行repr里面的內容 因為有repr的同時不會執行str內的內容
__len__方法
len方法估計也和str一樣但是返回的只能是int類型 它和len是有著莫大關聯的
class A:def __len__(obj):return 222a = A() print(len(a))?
?
單例模式:??
python中的單例模式 是依靠__new__方法來實現的
下面設計一個讓你類創建的對象都是同一個內存地址
就是你創建的所有的對象都是在同一個內存空間,后創建的對象會把之前的空間給覆蓋掉
因為你創建對象是開辟一個空間的,并且創建對象是__new__方法來控制的,那么設置不讓他調用父類的new方法進行創建對象就可以控制了單例
?
class B:__instance = Nonedef __new__(cls,*args, **kwargs):if cls.__instance is None : # 類調用自己的私有屬性obj = object.__new__(cls) # 基類在這里就是父類調用自己new就是創建了一個對象 開辟了一個空間cls.__instance = obj # 把開辟空間賦值給了 自己的私有屬性 進行值的改變 return cls.__instance # 私有屬性不是了就不會再執行者里面的過程了def __init__(self,name,age):self.name = nameself.age = agedef func(self):print(self.name)a = B('alex', 70) b = B('agon', 40) # print(a) # print(b) print(a.name) print(b.name)?
?
# item 對象使用中括號的形式去操作# __call__ # class Teacher(): # def __call__(self): # print(123) # def call(self):print(123) # t = Teacher() # t.call() # t() # 對象名() 相當于調用類內置的__call__ # 一個對象是否可調用 完全取決于這個對象對應的類是否實現了__call__ # callable # print(callable(Teacher)) # print(callable(t))# class A: # def __eq__(self, other): # # if self.__dict__ == other.__dict__: # return True # # __eq__() # a = A() # a.name = 'alex' # b = A() # b.name = 'egon' # print(a) # print(b) # print(a == b)# == 是由__eq__的返回值來決定的# __del__ 析構方法: 在刪除一個對象的時候做一些首尾工作 # class A: # def __init__(self): # pass # # self.f = open('文件','w') # def __del__(self): # print('執行我啦') # a = A() # del a # print('aaa')# class A: # def __init__(self): # self.f = open('文件','w') # def __del__(self): # self.f.close() # print('執行我啦') # a = A() # del a # print(a) # print('aaa')# __new__ 構造方法 # 實例化的時候 # 創造對象的過程 __new__ # __init__ 初始化# 設計模式 —— 單例模式 # 單例模式 就是 一個類 只能有一個實例 # class A:pass # a = A() # b = A() # print(a) # print(b)# class B: # __instance = None # def __new__(cls, *args, **kwargs): # if cls.__instance is None: # obj = object.__new__(cls) # cls.__instance = obj # return cls.__instance # def __init__(self,name,age): # self.name = name # self.age = age # def func(self): # print(self.name) # a = B('alex',80) # b = B('egon',20) # print(a) # print(b) # print(a.name) # print(b.name)# item # dic = {'k':'v'} # print(dic['k'])# class Foo: # def __init__(self,name): # self.name=name # # def __getitem__(self,item): # return self.__dict__[item] # # def __setitem__(self, key, value): # self.__dict__[key]=value # # def __delitem__(self, key): # print('del obj[key]時,我執行') # self.__dict__.pop(key)# f = Foo('alex') # # f.name = ... # print(f['name']) # f.__getitem__('name') # f['age'] = 18 # 賦值 # print(f.age) # 自帶的語法 # print(f['age']) # 修改 # f['age'] = 80 # print(f['age']) # 通過實現__getitem__得到的 # del f['age'] # print(f.age) # 刪除# class Foo: # def __init__(self,name): # self.name=name # def __delattr__(self, item): # print('del obj.key時,我執行') # self.__dict__.pop(item) # f = Foo('alex') # del f.name #相當于執行了__delattr__ # # delattr(f,'name')# 100個同一個類的對象 # Person name age sex # 100 name sex # class A: # pass?
__call__方法:
類直接加括號obj()就相當于調用了call方法 你要執行這個方法需要再后面再加上括號? 才能執行
class B:def __call__(self):return 6666b = B() B() #這一步你是調用call方法 print(b()) #這一步是實現這個方法class B:def __call__(self):print(4444)b = B() B()()?
只有一個對象 只開了一個內存空間創建一個類 單例模式中的對象屬性編程類中的靜態屬性,所有的方法變成類方法
設計模式 —— java
python中的單例模式 是使用__new__
轉載于:https://www.cnblogs.com/zhaoyunlong/p/8886348.html
總結
以上是生活随笔為你收集整理的面向对象进阶------内置函数 str repr new call 方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用python实现人脸检测转载
- 下一篇: vue mixins