日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

Python 面向对象之双下方法,内置函数

發(fā)布時(shí)間:2023/12/20 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python 面向对象之双下方法,内置函数 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

isinstance和issubclass

isinstance(obj,cls)? ? ??#?檢查是否obj是否是類 cls 的對象

class Foo(object):passobj = Foo()isinstance(obj, Foo) # ture

issubclass(sub, super)? # 檢查sub類是否是 super 類的派生類

class Foo(object):passclass Bar(Foo):passissubclass(Bar, Foo) # ture

反射

1 什么是反射

反射的概念是由Smith在1982年首次提出的,主要是指程序可以訪問、檢測和修改它本身狀態(tài)或行為的一種能力(自省)。這一概念的提出很快引發(fā)了計(jì)算機(jī)科學(xué)領(lǐng)域關(guān)于應(yīng)用反射性的研究。它首先被程序語言的設(shè)計(jì)領(lǐng)域所采用,并在Lisp和面向?qū)ο蠓矫嫒〉昧顺煽儭?/p>

2 python面向?qū)ο笾械姆瓷?#xff1a;通過字符串的形式操作對象相關(guān)的屬性。python中的一切事物都是對象(都可以使用反射)

四個(gè)可以實(shí)現(xiàn)自省的函數(shù) hasattr getattr setattr delattr

下列方法適用于類和對象(一切皆對象,類本身也是一個(gè)對象),還可以反射類中的模塊,查看模塊是否存在,總而言之,只要能用a.b 的都可以用

class Foo:f = '類的靜態(tài)變量'def __init__(self,name,age):self.name=nameself.age=agedef say_hi(self):print('hi,%s'%self.name)obj=Foo('egon',73)# hasattr(*args, **kwargs) 檢測是否含有某屬性 print(hasattr(obj,'name')) print(hasattr(obj,'say_hi'))# getattr(object, name, default=None) 獲取屬性 n = getattr(obj,'name') print(n) # egon func = getattr(obj,'say_hi') func() # hi,egon print(getattr(obj,'aaaaaaaa','不存在啊')) # 不存在啊# setattr(x, y, v) 設(shè)置屬性 setattr(obj,'sb',True) setattr(obj,'show_name',lambda self:self.name+'sb') print(obj.__dict__) # {'name': 'egon', 'age': 73, 'sb': True, 'show_name': <function <lambda> at 0x00000207DFFE6598>} print(obj.show_name(obj)) # egonsb# delattr(x, y) 刪除屬性 delattr(obj,'age') delattr(obj,'show_name') delattr(obj,'show_name111') # 不存在,則報(bào)錯(cuò)

__str__、__repr__和__fromat__

改變對象的字符串顯示__str__,__repr__,自定制格式化字符串__format__

str函數(shù) 或者 print函數(shù)? ?---> obj.__str__()
repr 或者 交互式解釋器 ---> obj.__repr__()
如果__str__沒有被定義,那么就會(huì)使用__repr__來代替輸出(備胎)
注意:這倆方法的返回值必須是字符串,否則拋出異常

#_*_coding:utf-8_*_format_dict={'nat':'{obj.name}-{obj.addr}-{obj.type}',#學(xué)校名-學(xué)校地址-學(xué)校類型'tna':'{obj.type}:{obj.name}:{obj.addr}',#學(xué)校類型:學(xué)校名:學(xué)校地址'tan':'{obj.type}/{obj.addr}/{obj.name}',#學(xué)校類型/學(xué)校地址/學(xué)校名 } class School:def __init__(self,name,addr,type):self.name=nameself.addr=addrself.type=typedef __repr__(self):return 'School(%s,%s)' %(self.name,self.addr)def __str__(self):return '(%s,%s)' %(self.name,self.addr)def __format__(self, format_spec):# if format_specif not format_spec or format_spec not in format_dict:format_spec='nat'fmt = format_dict[format_spec]return fmt.format(obj=self)s1=School('oldboy1','北京','私立') print('from repr: ',repr(s1)) # from repr: School(oldboy1,北京) print('from str: ',str(s1)) # from str: (oldboy1,北京) print(s1) # (oldboy1,北京)print(format(s1,'nat')) # oldboy1-北京-私立 print(format(s1,'tna')) # 私立:oldboy1:北京 print(format(s1,'tan')) # 私立/北京/oldboy1 print(format(s1,'asfdasdffd')) # oldboy1-北京-私立

__del__

析構(gòu)方法,當(dāng)對象在內(nèi)存中被釋放時(shí),自動(dòng)觸發(fā)執(zhí)行。

注:此方法一般無須定義,因?yàn)镻ython是一門高級(jí)語言,程序員在使用時(shí)無需關(guān)心內(nèi)存的分配和釋放,因?yàn)榇斯ぷ鞫际墙唤oPython解釋器來執(zhí)行,所以,析構(gòu)函數(shù)的調(diào)用是由解釋器在進(jìn)行垃圾回收時(shí)自動(dòng)觸發(fā)執(zhí)行的。

class Foo:def __del__(self):print('執(zhí)行我啦')f1=Foo() del f1 print('------->')# 輸出結(jié)果 執(zhí)行我啦 ------->

item系列

使類中的靜態(tài)變量可以像使用字典的方式一樣使用,__getitem__? ?\__setitem__? ? ?\__delitem__

class Foo:def __init__(self,name):self.name=namedef __getitem__(self, item):print(self.__dict__[item])def __setitem__(self, key, value):self.__dict__[key]=valuedef __delitem__(self, key):print('del obj[key]時(shí),我執(zhí)行')self.__dict__.pop(key)def __delattr__(self, item):print('del obj.key時(shí),我執(zhí)行')self.__dict__.pop(item)f1=Foo('sb') f1['age']=18 # 等同于f1.setitem('age',18) f1['age1']=19 del f1.age1 del f1['age'] f1['name']='alex' print(f1.__dict__) # {'name': 'alex'}

__new__

構(gòu)造方法,__new__ 實(shí)在執(zhí)行__init__ 之前執(zhí)行的,object 已實(shí)現(xiàn)該方法,所以一般不用寫,作用是創(chuàng)建一個(gè)self

class A:def __init__(self):self.x = 1print('in init function')def __new__(cls, *args, **kwargs):print('in new function')return object.__new__(A, *args, **kwargs)a = A() print(a.x)

單例模式

class Singleton:def __new__(cls, *args, **kw):if not hasattr(cls, '_instance'): # 判斷類的命名空間中是否存在變量_instancecls._instance = object.__new__(cls, *args, **kw) # 在類的命名空間中加了一個(gè)私有的靜態(tài)變量_instancereturn cls._instanceone = Singleton() two = Singleton()two.a = 3 print(one.a) # 3 # one和two完全相同,可以用id(), ==, is檢測 print(id(one)) # 29097904 print(id(two)) # 29097904 print(one == two) # True ,實(shí)際調(diào)用__eq__ 方法 print(one is two) # True

__call__

對象后面加括號(hào),觸發(fā)執(zhí)行。

注:構(gòu)造方法的執(zhí)行是由創(chuàng)建對象觸發(fā)的,即:對象 = 類名() ;而對于 __call__ 方法的執(zhí)行是由對象后加括號(hào)觸發(fā)的,即:對象() 或者 類()()

class Foo:def __init__(self):passdef __call__(self, *args, **kwargs):print('__call__')obj = Foo() # 執(zhí)行 __init__ obj() # 執(zhí)行 __call__

__len__

class A:def __init__(self):self.a = 1self.b = 2def __len__(self):return len(self.__dict__) a = A() print(len(a))

__hash__

object中未實(shí)現(xiàn),如果有需求,需要自己實(shí)現(xiàn)

class A:def __init__(self):self.a = 1self.b = 2def __hash__(self):return hash(str(self.a)+str(self.b)) a = A() print(hash(a))

__eq__

object已實(shí)現(xiàn)

class A:def __init__(self):self.a = 1self.b = 2def __eq__(self,obj):if self.a == obj.a and self.b == obj.b:return True a = A() b = A() print(a == b)

集合set判斷的依據(jù)是 先判斷__eq__ ,如果相同,在判斷__hash__, 如果兩者都相同,則認(rèn)為相同
String類型的equals方法 只比較內(nèi)容 不比較是否來引用同一個(gè)對象
== 實(shí)際調(diào)用__eq__ 方法,判斷值是否相等
is 判斷的是內(nèi)存地址,= 賦值時(shí)賦值的內(nèi)存地址 , 如果賦值時(shí)使用字符串,列表等,存在小地址池的原因,也會(huì)存在內(nèi)存地址相同的情況 ,is 運(yùn)算符比 == 效率高,在變量和None進(jìn)行比較時(shí),應(yīng)該使用 is

總結(jié)

以上是生活随笔為你收集整理的Python 面向对象之双下方法,内置函数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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