Python 面向對象之雙下方法,內置函數

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年首次提出的,主要是指程序可以訪問、檢測和修改它本身狀態或行為的一種能力(自省)。這一概念的提出很快引發了計算機科學領域關于應用反射性的研究。它首先被程序語言的設計領域所采用,并在Lisp和面向對象方面取得了成績。

2 python面向對象中的反射:通過字符串的形式操作對象相關的屬性。python中的一切事物都是對象(都可以使用反射)

四個可以實現自省的函數 hasattr getattr setattr delattr

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

class Foo:f = '類的靜態變量'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) 設置屬性
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') # 不存在,則報錯

__str__、__repr__和__fromat__

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

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

#_*_coding:utf-8_*_format_dict={'nat':'{obj.name}-{obj.addr}-{obj.type}',#學校名-學校地址-學校類型'tna':'{obj.type}:{obj.name}:{obj.addr}',#學校類型:學校名:學校地址'tan':'{obj.type}/{obj.addr}/{obj.name}',#學校類型/學校地址/學校名
}
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__

析構方法,當對象在內存中被釋放時,自動觸發執行。

注:此方法一般無須定義,因為Python是一門高級語言,程序員在使用時無需關心內存的分配和釋放,因為此工作都是交給Python解釋器來執行,所以,析構函數的調用是由解釋器在進行垃圾回收時自動觸發執行的。

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

item系列

使類中的靜態變量可以像使用字典的方式一樣使用,__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]時,我執行')self.__dict__.pop(key)def __delattr__(self, item):print('del obj.key時,我執行')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__

構造方法,__new__ 實在執行__init__ 之前執行的,object 已實現該方法,所以一般不用寫,作用是創建一個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)   # 在類的命名空間中加了一個私有的靜態變量_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 ,實際調用__eq__ 方法
print(one is two) # True

__call__

對象后面加括號,觸發執行。

注:構造方法的執行是由創建對象觸發的,即:對象 = 類名() ;而對于 __call__ 方法的執行是由對象后加括號觸發的,即:對象() 或者 類()()

class Foo:def __init__(self):passdef __call__(self, *args, **kwargs):print('__call__')obj = Foo() # 執行 __init__
obj()       # 執行 __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中未實現,如果有需求,需要自己實現

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已實現

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判斷的依據是 先判斷__eq__ ,如果相同,在判斷__hash__, 如果兩者都相同,則認為相同
String類型的equals方法 只比較內容 不比較是否來引用同一個對象
== 實際調用__eq__ 方法,判斷值是否相等
is 判斷的是內存地址,= 賦值時賦值的內存地址 , 如果賦值時使用字符串,列表等,存在小地址池的原因,也會存在內存地址相同的情況 ,is 運算符比 == 效率高,在變量和None進行比較時,應該使用 is

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/454404.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/454404.shtml
英文地址,請注明出處:http://en.pswp.cn/news/454404.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

teechart繪制實時曲線_快速學會CAD繪制傳輸線路圖紙

一工具CAD工程設計軟件二方法和步驟萬事開頭難&#xff0c;遇到不懂的知識剛開始都有畏難的情緒&#xff0c;只要有決心學習&#xff0c;誠心想學會一項技能&#xff0c;那學會學好它就只是時間問題了。我們常常面臨時間緊、需要快速入門甚至熟練地解決工作中實際情況的問題&am…

彝文計算機,試論計算機彝文字符編碼的轉換.pdf

試論計算機彝文字符編碼的轉換.pdf第17卷 第1期 云南民族大學學報(自然科學版) V01&#xff0e;17 No&#xff0e;12008年1月 Journal of Yunnan Nationalities University(Natural Sciences Edition) Jan&#xff0e;2o08試論計算機彝文字符編碼的轉換李金發(紅河學院人文學院…

ActiveMQ(07):ActiveMQ結合Spring開發--建議

1、Camel框架支持大量的企業集成模式&#xff0c;可以大大簡化集成組件間的大量服務和復雜的消息流。而Spring框架更注重簡單性&#xff0c;僅僅支持基本的最佳實踐。 2、Spring消息發送的核心架構是JmsTemplate&#xff0c;隔離了像打開、關閉Session和Producer的繁瑣操作&…

使用ajax獲取用戶所在地的天氣

1.要獲取用戶歸屬地的天氣&#xff0c;首先得獲取用戶所在的市區&#xff0c; 這里先獲取用戶的IP&#xff0c;通過IP獲取IP的歸屬地&#xff0c;從而得到用戶 地址。 獲取客戶端ip: js: <scripttype"text/javascript" src"http://pv.sohu.com/cityjson?ieu…

Python 之協程

之前我們學習了線程、進程的概念&#xff0c;了解了在操作系統中進程是資源分配的最小單位,線程是CPU調度的最小單位。按道理來說我們已經算是把cpu的利用率提高很多了。但是我們知道無論是創建多進程還是創建多線程來解決問題&#xff0c;都要消耗一定的時間來創建進程、創建線…

ip變換器蘋果系統_加密鎖能為高鐵做什么?鐵路電力變換器系統告訴您

代表國之重器的高鐵&#xff0c;是怎樣保護他們在軟件上投資的專有技術不被仿冒、逆向工程和篡改呢&#xff1f;與一般的軟件保護加密不同&#xff0c;高鐵運行中的實時控制器對物理環境有著嚴苛的要求&#xff0c;如鐵路電力變換器系統&#xff0c;須滿足典型工業應用的擴展溫…

華為服務器ibmc怎么裝系統,華為服務器安裝操作系統

《華為服務器安裝操作系統》由會員分享&#xff0c;可在線閱讀&#xff0c;更多相關《華為服務器安裝操作系統(11頁珍藏版)》請在人人文庫網上搜索。1、華為服務器安裝操作系統 1把網線接到服務器管理口上&#xff0c;2288服務器管理口在服務器背后中下 部位置&#xff0c;有Mg…

英語面試(自我介紹,電話面試..)

大凡找工作的人&#xff0c;都有對面試的擔心&#xff0c;而英語面試最令人頭痛。面試氣氛總是緊張的&#xff0c;一緊張就容易出錯&#xff0c;中文“臺詞”都會結巴&#xff0c;何況英語&#xff01; 可俗話說&#xff0c;養兵千日&#xff0c;用兵一時&#xff0c;學了那么多…

服務端渲染與 Universal React App

隨著 Webpack 等前端構建工具的普及&#xff0c;客戶端渲染因為其構建方便&#xff0c;部署簡單等方面的優勢&#xff0c;逐漸成為了現代網站的主流渲染模式。而在剛剛發布的 React v16.0 中&#xff0c;改進后更為優秀的服務端渲染性能作為六大更新點之一&#xff0c;被 React…

zxing .net 多種條碼格式的生成

下載地址&#xff1a;http://zxingnet.codeplex.com/ zxing.net是.net平臺下編解條形碼和二維碼的工具&#xff0c;使用非常方便。 本文主要說明一下多種類型條碼的生成。 適用的場景&#xff0c;標簽可視化設計時&#xff0c;自定義條碼類型&#xff0c;預覽。 遍歷zxing支持的…

k8s dashboard_windows10 部署 docker+k8s 集群

下面是經過踩坑之后的 windows10 單機部署 docker k8s 步驟&#xff0c;其中有幾處比較關鍵的地方需要注意&#xff0c;后面加粗標注&#xff0c;下面就開始吧&#xff01;0、下載cmder在 windows 上有一個趁手的命令行工具非常有必要&#xff0c;推薦 Cmder&#xff0c;下面是…

Python 之網絡編程基礎

套接字&#xff08;socket&#xff09;初使用 基于TCP協議的socket tcp是基于鏈接的&#xff0c;必須先啟動服務端&#xff0c;然后再啟動客戶端去鏈接服務端 server端 import socket sk socket.socket() sk.bind((127.0.0.1,8898)) # 把地址綁定到套接字 sk.listen() …

ajax on ture,細數Ajax請求中的async:false和async:true的差異

實例如下&#xff1a;function test(){var temp"00";$.ajax({async: false,type : "GET",url : userL_checkPhone.do,complete: function(msg){alert(complete);},success : function(data) {alert(success);tempdata;temp"aa";}});alert(temp);…

阿里云郵箱登錄日志中有異地IP登錄是怎么回事?該怎么辦?

注意&#xff0c;請先到阿里云官網 領取幸運券&#xff0c;除了價格上有很多優惠外&#xff0c;還可以參與抽獎。詳見&#xff1a;https://promotion.aliyun.com/ntms/act/ambassador/sharetouser.html?userCode2a7uv47d&utm_source2a7uv47d以下可能&#xff1a;1、您的郵…

面試之網絡編程和并發

1、簡述 OSI 七層協議。 物理層&#xff1a;主要基于電器特性發送高低電壓(1、0)&#xff0c;設備有集線器、中繼器、雙絞線等&#xff0c;單位&#xff1a;bit 數據鏈路層&#xff1a;定義了電信號的分組方式&#xff0c;設備&#xff1a;交換機、網卡、網橋&#xff0c;單位&…

redis 遠程主機強迫關閉了一個現有的連接_記一次Redis+Getshell經驗分享

你是我患得患失的夢&#xff0c;我是你可有可無的人&#xff0c;畢竟這穿越山河的箭&#xff0c;刺的都是用情之疾的人。前言&#xff1a;當我們接到一個授權滲透測試的時候&#xff0c;常規漏洞如注入、文件上傳等嘗試無果后&#xff0c;掃描端口可能會發現意外收獲。知己知彼…

無線連接 服務器,服務器無線遠程連接

服務器無線遠程連接 內容精選換一換華為云幫助中心&#xff0c;為用戶提供產品簡介、價格說明、購買指南、用戶指南、API參考、最佳實踐、常見問題、視頻幫助等技術文檔&#xff0c;幫助您快速上手使用華為云服務。使用Mac版Microsoft Remote Desktop工具&#xff0c;遠程連接W…

面試前您該做的事情

選自本人作品&#xff1a;《軟件性能測試與LR實戰》 無論您是剛剛畢業的大學生朋友&#xff0c;還是已經有工作經驗的同行&#xff0c;大家都不可避免的面臨一個問題就是找工作或者換工作的問題。在整個應聘過程中&#xff0c;面試無疑是最具有決定性意義的重要環節&#xff0c…

IO模型

IO模型介紹 傳統的網絡IO模型包括五種&#xff1a; blocking IO 阻塞IOnonblocking IO 非阻塞IOIO multiplexing IO多路復用signal driven IO 信號驅動IOasynchronous IO 異步IO 由于signal driven IO&#xff08;信號驅動IO&#xff09;在實際中…

重溫數據結構:樹 及 Java 實現(轉)

轉自&#xff1a;http://blog.csdn.net/u011240877/article/details/53193877 讀完本文你將了解到&#xff1a; 什么是樹樹的相關術語 根節點父親節點孩子節點葉子節點如上所述節點的度樹的度節點的層次樹的高度樹的深度樹的兩種實現 數組表示鏈表表示的節點樹的幾種常見分類及…