python之路 物件導向之反射

2021-08-25 14:04:24 字數 3347 閱讀 7043

isinstance() 與 issubclass():

isinstance():用於判斷乙個物件是否為乙個類的例項

python中說一切皆物件,那麼我們判斷乙個變數是否為某個資料型別的時候,就可以使用isinstance()

l = [1,2,3]

print(isinstance(l,list))

#true

#注:l是list這個類的乙個例項物件,l=[1,2,3]的本質是l = list([1,2,3])

那麼為什麼使用isinstance(),而不是最容易想到的type()呢?

1.type() 與isinstance()的判斷區別:

type()不會認為子類是一種父類型別,isinstance()會認為子類是一種父類型別。

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)

此外,新式類與經典類的type(),返回結果不同

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())

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()))

2.python作為動態語言,在使用的時候不需要宣告變數型別,使用type檢測特定的型別物件,會破壞**的靈活性....

issubclass():用於判斷乙個類是不是另乙個類的子類

class people:

pass

class p(people):

pass

print(issubclass(p, people))

#true

反射

概念:反射是指程式擁有訪問,檢測和修改自身狀態和行為的一種能力

通過四個函式實現內省:hasattr(),getattr(),delattr(),setattr()

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

此外,使用者可以通過input()輸入字串,來反射類內的屬性(資料屬性與函式屬性),從而達到操作物件屬性的效果

在模擬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...