日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

面向对象进阶------内置函数 str repr new call 方法

發(fā)布時(shí)間:2024/4/13 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 面向对象进阶------内置函数 str repr new call 方法 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

__new__方法:

我們來講個(gè)非常非常重要的內(nèi)置函數(shù)和init一樣重要__new__其實(shí)在實(shí)例話對(duì)象的開始? 是先繼承父類中的new方法再執(zhí)行init的? 就好比你生孩子 先要把孩子生出來才能對(duì)孩子穿衣服的? new就是生孩子 init是給孩子穿衣服

new()是在新式類中新出現(xiàn)的方法,它作用在構(gòu)造方法init()建造實(shí)例之前,可以這么理解,在Python 中存在于類里面的構(gòu)造方法init()負(fù)責(zé)將類的實(shí)例化,而在init()調(diào)用之前,new()決定是否要使用該init()方法,因?yàn)閚ew()可以調(diào)用其他類的構(gòu)造方法或者直接返回別的對(duì)象來作為本類 的實(shí)例。?
如果將類比喻為工廠,那么init()方法則是該工廠的生產(chǎn)工人,init()方法接受的初始化參 數(shù)則是生產(chǎn)所需原料,init()方法會(huì)按照方法中的語(yǔ)句負(fù)責(zé)將原料加工成實(shí)例以供工廠出貨。而?new()則是生產(chǎn)部經(jīng)理,new()方法可以決定是否將原料提供給該生產(chǎn)部工人,同時(shí)它還決定著出 貨產(chǎn)品是否為該生產(chǎn)部的產(chǎn)品,因?yàn)檫@名經(jīng)理可以借該工廠的名義向客戶出售完全不是該工廠的產(chǎn)品。?
new()方法的特性:?
new()方法是在類準(zhǔn)備將自身實(shí)例化時(shí)調(diào)用。?
new()方法始終都是類的靜態(tài)方法,即使沒有被加上靜態(tài)方法裝飾器。

而在實(shí)例化開始之后,在調(diào)用?init()方法之前,Python首先調(diào)用new()方法:

如果以建房子做比喻,new()方法負(fù)責(zé)開發(fā)地皮,打下地基,并將原料存放在工地。而init()方法負(fù)責(zé)從工地取材料建造出地皮開發(fā)招標(biāo)書中規(guī)定的大樓,init()負(fù)責(zé)大樓的細(xì)節(jié)設(shè)計(jì),建造,裝修使其可交付給客戶。

在新式類中new()才是真正的實(shí)例化方法

?

內(nèi)置方法 必須能看懂 能用盡量用
__len__ len(obj)的結(jié)果依賴于obj.__len__()的結(jié)果,計(jì)算對(duì)象的長(zhǎng)度
__hash__ hash(obj)的結(jié)果依賴于obj.__hash__()的結(jié)果,計(jì)算對(duì)象的hash值
__eq__ obj1 == obj2 的結(jié)果依賴于obj.__eq__()的結(jié)果,用來判斷值相等
__str__ str(obj) print(obj) '%s'%obj 的結(jié)果依賴于__str__,用來做輸出、顯示
__repr__ repr(obj) '%r'%obj的結(jié)果依賴于__repr__,還可以做str的備胎
__format__ format() 的結(jié)果依賴于__format__的結(jié)果,是對(duì)象格式化的
__call__ obj()相當(dāng)于調(diào)用__call__,實(shí)現(xiàn)了__call__的對(duì)象是callable的
__new__ 構(gòu)造方法,在執(zhí)行__init__之前執(zhí)行,負(fù)責(zé)創(chuàng)建一個(gè)對(duì)象,在單例模式中有具體的應(yīng)用
__del__ 析構(gòu)方法,在對(duì)象刪除的時(shí)候,刪除這個(gè)對(duì)象之前執(zhí)行,主要用來關(guān)閉在對(duì)象中打開的系統(tǒng)的資源

_str__和__repr__方法:

來講一下類中經(jīng)常用到的 內(nèi)置函數(shù)? __str__和__repr__方法

我個(gè)人理解? __repr__是比__str__方法功能更加強(qiáng)大的 一個(gè)方法? 能讓你使用的更加廣泛? ?str就是你在打印你實(shí)例的對(duì)象的時(shí)候你所對(duì)類中str方法返回的內(nèi)容會(huì)被輸出

__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])) #把你傳遞進(jìn)來的 迭代對(duì)象中的信息中的元素都轉(zhuǎn)化為字符串類型的 然后把 信息再給轉(zhuǎn)化為列表的額形式輸出def __str__(self): #__str__類型的必須是要用return來返回的 并且返回值也必須是字符串類型的return 'niha' l = List(1, 2, 3, 4) print(l)

當(dāng)需要使用__str__的場(chǎng)景時(shí)找不到 __str__就找__repr__當(dāng)需要使用__repr__的場(chǎng)景時(shí)找不到__repr__的時(shí)候就找父類的repr雙下repr是雙下str的備胎

當(dāng)你的語(yǔ)句中同時(shí)出現(xiàn) str? 和repr的時(shí)候一定會(huì)執(zhí)行repr里面的內(nèi)容 因?yàn)橛衦epr的同時(shí)不會(huì)執(zhí)行str內(nèi)的內(nèi)容

__len__方法

len方法估計(jì)也和str一樣但是返回的只能是int類型 它和len是有著莫大關(guān)聯(lián)的

class A:def __len__(obj):return 222a = A() print(len(a))

?

?

單例模式:??

python中的單例模式 是依靠__new__方法來實(shí)現(xiàn)的

下面設(shè)計(jì)一個(gè)讓你類創(chuàng)建的對(duì)象都是同一個(gè)內(nèi)存地址

就是你創(chuàng)建的所有的對(duì)象都是在同一個(gè)內(nèi)存空間,后創(chuàng)建的對(duì)象會(huì)把之前的空間給覆蓋掉

因?yàn)槟銊?chuàng)建對(duì)象是開辟一個(gè)空間的,并且創(chuàng)建對(duì)象是__new__方法來控制的,那么設(shè)置不讓他調(diào)用父類的new方法進(jìn)行創(chuàng)建對(duì)象就可以控制了單例

?

class B:__instance = Nonedef __new__(cls,*args, **kwargs):if cls.__instance is None : # 類調(diào)用自己的私有屬性obj = object.__new__(cls) # 基類在這里就是父類調(diào)用自己new就是創(chuàng)建了一個(gè)對(duì)象 開辟了一個(gè)空間cls.__instance = obj # 把開辟空間賦值給了 自己的私有屬性 進(jìn)行值的改變 return cls.__instance # 私有屬性不是了就不會(huì)再執(zhí)行者里面的過程了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 對(duì)象使用中括號(hào)的形式去操作# __call__ # class Teacher(): # def __call__(self): # print(123) # def call(self):print(123) # t = Teacher() # t.call() # t() # 對(duì)象名() 相當(dāng)于調(diào)用類內(nèi)置的__call__ # 一個(gè)對(duì)象是否可調(diào)用 完全取決于這個(gè)對(duì)象對(duì)應(yīng)的類是否實(shí)現(xiàn)了__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__ 析構(gòu)方法: 在刪除一個(gè)對(duì)象的時(shí)候做一些首尾工作 # class A: # def __init__(self): # pass # # self.f = open('文件','w') # def __del__(self): # print('執(zhí)行我啦') # a = A() # del a # print('aaa')# class A: # def __init__(self): # self.f = open('文件','w') # def __del__(self): # self.f.close() # print('執(zhí)行我啦') # a = A() # del a # print(a) # print('aaa')# __new__ 構(gòu)造方法 # 實(shí)例化的時(shí)候 # 創(chuàng)造對(duì)象的過程 __new__ # __init__ 初始化# 設(shè)計(jì)模式 —— 單例模式 # 單例模式 就是 一個(gè)類 只能有一個(gè)實(shí)例 # 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]時(shí),我執(zhí)行') # self.__dict__.pop(key)# f = Foo('alex') # # f.name = ... # print(f['name']) # f.__getitem__('name') # f['age'] = 18 # 賦值 # print(f.age) # 自帶的語(yǔ)法 # print(f['age']) # 修改 # f['age'] = 80 # print(f['age']) # 通過實(shí)現(xiàn)__getitem__得到的 # del f['age'] # print(f.age) # 刪除# class Foo: # def __init__(self,name): # self.name=name # def __delattr__(self, item): # print('del obj.key時(shí),我執(zhí)行') # self.__dict__.pop(item) # f = Foo('alex') # del f.name #相當(dāng)于執(zhí)行了__delattr__ # # delattr(f,'name')# 100個(gè)同一個(gè)類的對(duì)象 # Person name age sex # 100 name sex # class A: # pass

?

__call__方法:

類直接加括號(hào)obj()就相當(dāng)于調(diào)用了call方法 你要執(zhí)行這個(gè)方法需要再后面再加上括號(hào)? 才能執(zhí)行

class B:def __call__(self):return 6666b = B() B() #這一步你是調(diào)用call方法 print(b()) #這一步是實(shí)現(xiàn)這個(gè)方法class B:def __call__(self):print(4444)b = B() B()()

?

只有一個(gè)對(duì)象 只開了一個(gè)內(nèi)存空間
創(chuàng)建一個(gè)類 單例模式中的對(duì)象屬性編程類中的靜態(tài)屬性,所有的方法變成類方法
設(shè)計(jì)模式 —— java
python中的單例模式 是使用__new__

轉(zhuǎn)載于:https://www.cnblogs.com/zhaoyunlong/p/8886348.html

總結(jié)

以上是生活随笔為你收集整理的面向对象进阶------内置函数 str repr new call 方法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。