isinstance() 與 issubclass():isinstance():用於判斷乙個物件是否為乙個類的例項
python中說一切皆物件,那麼我們判斷乙個變數是否為某個資料型別的時候,就可以使用isinstance()
那麼為什麼使用isinstance(),而不是最容易想到的type()呢?l = [1,2,3]
print(isinstance(l,list))
#true
#注:l是list這個類的乙個例項物件,l=[1,2,3]的本質是l = list([1,2,3])
1.type() 與isinstance()的判斷區別:
type()不會認為子類是一種父類型別,isinstance()會認為子類是一種父類型別。
此外,新式類與經典類的type(),返回結果不同class mylist(list):
def __init__(self, l):
super().__init__()
self.l = l
l = mylist([1, 2, 3, 4])
print(type(l) is list)
print(isinstance(l, list))
#false
#true
#我們對內建型別(類)進行了擴充套件,mylist例項化得到的物件應該也是list型別(它擁有list類產生物件的所有綁#定方法,但是用type()得到的結果卻是false)
python 2.7.15 (v2.7.15:ca079a3ea3, apr 30 2018, 16:30:26) [msc v.1500 64 bit (amd64)] on win32
>>> class a:pass
...>>> class b:pass
...>>> print type(a())
>>> print type(b())
2.python作為動態語言,在使用的時候不需要宣告變數型別,使用type檢測特定的型別物件,會破壞**的靈活性....python 3.6.4 (v3.6.4:d48eceb, dec 19 2017, 06:04:45) [msc v.1900 32 bit (intel)] on win32
>>> class a:pass
...>>> class b:pass
...>>> print(type(a()))
>>> print(type(b()))
issubclass():用於判斷乙個類是不是另乙個類的子類
class people:
pass
class p(people):
pass
print(issubclass(p, people))
#true
反射:概念:反射是指程式擁有訪問,檢測和修改自身狀態和行為的一種能力
通過四個函式實現內省:hasattr(),getattr(),delattr(),setattr()
此外,使用者可以通過input()輸入字串,來反射類內的屬性(資料屬性與函式屬性),從而達到操作物件屬性的效果class people:
country = 'china'
def __init__(self, name, age):
self.name = name
self.age = age
def func(self):
print('1')
p = people('bob', 23)
print(people.country) #底層原理實際上是people.__dict__['country']
print(hasattr(p,'name')) #判斷類或物件中有無某個屬性(會按照繼承查詢順序)
print(getattr(p,'name')) #第三個引數不指定的情況下,屬性不存在會報錯
print(getattr(p,'a',none)) #不存在返回none
在模擬ftp傳輸中,我們可以根據使用者的指令來反射server類中的方法
#settings配置檔案
server_address = ('127.0.0.1',8080)
#server端核心層偽**
import struct
import json
import socketserver
from conf import settings
class myserver(socketserver.baserequesthandler):
def handle(self):
while true:
try:
header_len = self.request.recv(4) # 接收報頭的長度
if header_len == 0: break # 針對linux,客戶端單方面退出後發空資料的場景
header = self.request.recv(struct.unpack('i', header_len)[0]) #接收包含指令資訊的報頭
header_dic = json.loads(header.decode('utf-8'))
if hasattr(self, header_dic['cmd']):
func = getattr(self, header_dic['cmd'])
func(header_dic)
except connectionreseterror:
break
def upload(self,header_dic):
pass
def down(self,header_dic):
pass
def makdir(self,header_dic):
pass
def remove(self,header_dic):
pass
if __name__ == '__main__':
obj = socketserver.threadingtcpserver \
(settings.server_address, myserver, bind_and_activate=true) # 第三個引數可省略
obj.serve_forever() # 相當於建立連線迴圈
python之路 物件導向
不了解什麼是物件導向,就無法更好的掌握python python既支援面向過程的程式設計也支援物件導向的程式設計。面向過程 程式是由過程或僅僅是可重用 的函式構建起來的。物件導向 程式是由資料和功能組合而成的物件構建起來的。物件導向中兩個重要的概念是類和物件。類是對事物的抽象,比如說 人類 物件是具...
Python學習之路 物件導向
物件導向 物件導向的程式設計的核心是物件 相當於你要處於創造者的思維來建立乙個新的東西,如你要實現什麼東西,需要幹什麼才能創造出來 要理解物件為何物。物件導向的程式設計好比作者寫 作者要解決的問題就是使主角從乙個屌絲公升級到大神的故事,作者覺得要讓主角成為大神,會給主角鋪墊從弱到強的大綱,主角很弱時...
python自學之路 物件導向
定義 指類中無需例項參與即可呼叫的方法 不需要self引數 在呼叫過程中,無需將類例項化,直接在類之後使用.號運算子呼叫方法。用法 靜態方法使用 staticmethod裝飾器來宣告 class classa object staticmethod def func a print hello py...