python之路(9)反射 包裝類 動態模組匯入

2022-07-01 13:03:10 字數 4957 閱讀 1771

目錄

python提供自省的四個方法:

hasattr(object,name)  判斷object中有沒有有個name字串對應對應的方法和屬性

class demo:

name = 'chen'

age = '22'

def test_func(self):

print("存在")

hasattr(demo, 'test_func') #true

hasattr(demo, 'name') #true

hasattr(demo, 'date') #false

(常用)getattr(object,name,default=none)根據name字串尋找object中對應的資料屬性或函式屬性,相當於object.name

class demo:

name = 'chen'

age = '22'

def test_func(self):

print("存在")

getattr(demo, 'test_func') #getattr(demo, 'name') #chen

getattr(demo, 'date') #報錯

setattr(object,name,value)根據name字串去設定或修改object中相對應的資料屬性或函式屬性,相當於object.name=value

class demo:

name = 'chen'

age = '22'

def test_func(self):

print("存在")

#設定資料屬性

setattr(demo,'date','2018/11/21')

print(getattr(demo, 'date')) #2018/11/21

#設定函式屬性

setattr(demo,'test2_func',lambda x:x+2)

print(getattr(demo, 'test2_func')(8)) #10

delattr(object,name)根據name字串去刪除object中相對應的資料屬性或函式屬性,相當於del object.name

class demo:

name = 'chen'

age = '22'

def test_func(self):

print("存在")

delattr(demo,'name')

反射使用類中用到的三個內建函式

(常用)_getattr_  當訪問的屬性找不要的時候執行這個這個函式

class demo:

def __init__(self,name,age):

self.name = name

self.age = age

def __getattr__(self, item):

print("不存在%s屬性"%item)

d1 = demo('chen',22)

#呼叫不存在的屬性

d1.data #不存在data屬性

補充:_getattribute_    當訪問屬性時,無論屬性存不存在,都會執行,當與_getattr_函式同時存在時,優先執行_getattribute_ ,忽略_getattr_函式。

所以_getattr_是在_getattribute_ 中丟擲乙個attributrerror時才會執行

class demo:

def __init__(self,name,age):

self.name = name

self.age = age

def __getattr__(self, item): #會被忽略

print("這裡是getattr")

def __getattribute__(self, item):

print("這裡是getattribute")

# raise attributeerror('丟擲異常')

d1 = demo('chen',22)

#呼叫不存在的屬性

d1.data #這裡是getattribute

class demo:

def __init__(self,name,age):

self.name = name

self.age = age

def __getattr__(self, item):

print("這裡是getattr")

def __getattribute__(self, item):

print("這裡是getattribute")

raise attributeerror('丟擲異常') #丟擲異常,會呼叫__getattr__方法去執行

d1 = demo('chen',22)

#呼叫不存在的屬性

d1.data #這裡是getattribute\n這裡是getattr

_setattr_   當賦值屬性值時執行這個函式

class demo:

def __init__(self,name,age):

self.name = name #賦值操作

self.age = age #賦值操作

def __setattr__(self, key, value):

print("key:%s value:%s"%(key,value))

self.__dict__[key]=value

d1 = demo('chen',22) #key:name value:chen key:age value:22

_delattr_   當刪除屬性事執行這個函式

class demo:

def __init__(self,name,age):

self.name = name #賦值操作

self.age = age #賦值操作

def __delattr__(self, item):

print("刪除%s"%item)

self.__dict__.pop(item)

d1 = demo('chen',22)

del d1.name #刪除name

變數賦值操作的自定製之所有字串大寫

class demo:

def __init__(self,name,age):

self.name = name #賦值操作

self.age = age #賦值操作

def __setattr__(self, key, value):

if type(value) is str:

self.__dict__[key] = value.upper() #制定大寫

else:

self.__dict__[key] = value

d1 = demo('chen',22)

print(d1.__dict__) #

class list(list):

if type(value) is str:

else:

print('只能新增字串型別')

def show_midlle(self): #求列表中間的value

mid_index=int(len(self)/2)

return self[mid_index]

l1=list('chen')

l1.show_midlle() #e

授權也是一種包裝,但不是通過繼承去實現,利用_getattr_實現

import time

class filehandle:

def __init__(self,filename,mode='r',encoding='utf-8'):

#已實現的功能,依然用原來的功能

self.file=open(filename,mode,encoding=encoding)

# 定製在寫入檔案時,寫入時間的寫函式

def write(self,line):

t=time.strftime('%y-%m-%d %x')

self.file.write('%s %s' %(t,line))

#如果訪問的屬性不純在

def __getattr__(self, item):

return getattr(self.file,item)

f1=filehandle('a.txt','w+',encoding='utf-8')

f1.write('第一條\n')

f1.write('第二條\n')

f1.write('第三條\n')

2018-11-21 19:11:07第一條

2018-11-21 19:11:07第二條

2018-11-21 19:11:07 第三條

# 匯入的是m1,不是m1下的t檔案

# 這樣匯入的是路徑最頂層的模組

module_t = __import__('m1.t') #

print(module_t) #module_t.t.test3() #這裡是t模組

#利用模組匯入

import importlib

#匯入的是m1下的t檔案

m = importlib.import_module("m1.t")

print(m) # m.test3() #這裡是t模組

python類 包裝 授權

包裝 是指對乙個已經存在的物件進行系定義加工。實現授權是包裝的乙個特性。包裝乙個型別通常是對已存在的型別進行一些自定義定製,這種做法可以新建,修改,或刪除原有產品的某些功能,而其他的保持不變。授權的過程,其實也就是所有的更新功能都交給新類的自定義的某部分功能來處理,但已存在的功能就授權給物件的預設屬...

Python之路 特別篇 Python反射

說反射之前先介紹一下 import 方法,這個和import匯入模組的另一種方式 1.import commons 2.import commons 如果是多層匯入 1.from list.text import commons 2.import list.text.commons fromlist...

python類與反射

目錄 物件導向程式設計與面向過程程式設計 定義類例項化物件 屬性查詢 繫結給物件的方法 反射面向過程 核心是過程二字,過程指的是解決問題的步驟,即先幹什麼再幹什麼 基於該思想編寫程式就好比在設計一條流水線 物件導向 核心是物件二字,物件指的是特徵與技能的結合體,基於該思想編寫程式就好比在創造乙個世界...