python面向對象進階(1)

面向對象進階

isinstance(obj,cls) 檢查是否obj是類cls的對象
class Foo(object):
pass
obj = Foo()

isinstance(obj,Foo)
issubclass(sub,super) 檢查sub是否是super的派生類
class Foo(object):
pass
class Bar(Foo):
pass
issubclass(Bar,Foo)

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


class BlackManger:
feature = 'ugly'
def __init__(self,name,addr):
self.name = name
self.addr = addr
def sell_house(self):
print('%s' %self.name)
def rent_house(self):
print('%s' %self.name)
b1 = BlackManger('somecompany','zgc')

檢測是否含有某種屬性
print(hasattr(b1,'name'))
print(hasattr(b1,'sell_house'))

獲取屬性
n = getattr(b1,'name')
print(n)
func = getattr(b1,'rent_house')
func()


getattr(b1,'aaaaaa')
print(getattr(b1,'aaaaaaa','bucunzai'))


設置屬性
setattr(b1,'sb',True)
setattr(b1,'show_name',lambda self:self.name+'sb')
print(b1.__dict__)
print(b1.show_name(b1))

刪除屬性
delattr(b1,'addr')
delattr(b1,'show_name')
delattr(b1,'show_name111')#不存在,則報錯

print(b1.__dict__)

類也是對象
class Foo(object):
staticField = 'old boy'
def __init__(self):
self.name = 'lzq'
def func(self):
return 'func'
@staticmethod
def bar():
return 'bar'

print(getattr(Foo,'staticField'))
print(getattr(Foo,'func'))
print(getattr(Foo,'bar'))

反射當前模塊成員
import sys

def s1():
print('s1')
def s2():
print('s2')
this_module = sys.modules[__name__]

hasattr(this_module,'s1')
hasattr(this_module,'s2')


導入其他模塊,利用反射查找該模塊是否存在某個方法
# -*- coding:utf-8 -*-

def test():
print('from the test')

# -*- coding:utf-8 -*-
import module_test as obj
#obj.test()
print(hasattr(obj,'test'))

getattr(obj,'test')()

使用反射的好處

class FtpClient:
'未完成'
def __init__(self,addr):
print('正在連接服務器[%s]' %addr)
self.addr = addr
#from module import FtpClient
f1 = FtpClient('192.168.0.0')
if hasattr(f1,'get'):
func_get = getattr(f1,'get')
func_get()
else:
print('不存在此方法')
print('處理其他的邏輯')

__setattr__,__delattr__,__getattr__

class Foo:
x=1
def __init__(self,y):
self.y = y
def __getattr__(self,item):
print('-----> from getattr:"你找的屬性不存在')
def __setattr__(self,key,value):
print('----> from setattr')
self.__dict__[key] = value
def __delattr__(self,item):
print('----> from delattr')
self.__dict__.pop(item)

f1 = Foo(10)
print(f1.__dict__)

f1.z = 3

print(f1.__dict__)

f1.__dict__['a']=3
del f1.a
print(f1.__dict__)

f1.xxxxxx

二次加工標準類型(包裝)

class List(list):#繼承list所有屬性,也可以派生出自己新的,比如append和mid
def append(self,p_object):
'派生自己的append:加上類型檢查'
if not isinstance(p_object,int):
rasie TypeError('must be int')
super().apppend(p_object)
@property
def mid(self):
'新增自己的屬性'
index = len(self)//2
return self[index]
l = List([1,2,3,4])
print(l)
l.append(5)
print(l)
#l.append('11212132') #報錯,必須為int類型

print(l.mid)

#其余方法都繼承list的
l.insert(0,-1233)
print(l)
l.clear()
print(l)


實現授權的關鍵點就是覆蓋__getattr__方法

import time
class FileHndle:
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 %T')
self.file.write('%s %s' %(t,line))
def __getattr__(self,item):
return getattr(self.file,item)
f1 = FileHandle('b.txt','w+')
f1.write('hello')
f1.seek(0)
print(f1.read())
f1.close()

#我們來加上b模式支持

import time
class FileHandle:
def __init__(self,filename,mode='r',encoding='utf-8'):
if 'b' in mode:
self.file = open(filename,mode)
else:
self.file = open(filename,mode,encoding = encoding)
self.filename=filename
self.mode = mode
self.encoding = encoding
def write(self,line):
if 'b' in self.mode:
if not isinstance(line,bytes):
raise TypeError('must be bytes')
self.file.write(line)
def __getattr__(self,item):
return getattr(self.file,item)
def __str__(self):
if 'b' in self.mode:
res="<_io.BufferedReader name='%s'>" %self.filename
else:
res="<_io.TextIOWrapper name='%s' mode='%s' encoding='%s'>" %(self.filename,self.mode,self.encoding)
return res

f1=FileHandle('b.txt','wb')
# f1.write('你好啊啊啊啊啊') #自定制的write,不用在進行encode轉成二進制去寫了,簡單,大氣
f1.write('你好啊'.encode('utf-8'))
print(f1)
f1.close()

?

作業:
基于授權定制自己的列表類型,要求定制的自己的__init__方法,
定制自己的append:只能向列表加入字符串類型的值
定制顯示列表中間那個值的屬性(提示:property)
其余方法都使用list默認的(提示:__getattr__加反射)

class List:
def __init__(self,seg):
self.seq = seq
def append(self,p_object):
'派生加上類型檢查'
if not isinstance(p_object,str):
raise TypeError('must be str')
self.seq.append(p_object)

@property
def mid(self):
'新增方法'
index = len(self.seq)//2
return self.seq[index]
def __getattr__(self,item):
return getattr(self.seq,item)
def __str__(self):
return str(self.seq)
l = List(['1','2','3'])
print(l)
l.append(4)
print(l)

?

轉載于:https://www.cnblogs.com/lzq1987/p/6758575.html

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

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

相關文章

智能小車37:異常在ARM、JAVA、硬件里的實現

幾乎所有編程語言都有異常&#xff0c;可以說有程序就有異常。今天學習Arm的中斷(異常)處理,聯想到Java的異常,硬件中如何實現等問題&#xff0c;下面給大家分享一下。 一、Arm的中斷。 1.觸發異常 2.保存現場 3.cpu進入異常工作模式&#xff0c;程序指針(pc)跳入異常入口&…

c++builder提高批量動態創建panel的速度_騎行時影響速度的事項有哪些 怎樣有效提高騎行速度 單車租賃信息...

撇開人的因素在自行車的組件中對車速影響最大的幾項是什么?車重?自鎖?輪組?傳動?我的個人感受&#xff0c;從提高幅度上來講&#xff0c;而不是重要性上來講一、自鎖起碼提高你50%的速度&#xff0c;我不用自鎖和別人一起走AVS25就很辛苦了&#xff0c;用了自鎖&#xff0…

ansys matlab 調用,matlab 調用ansys (轉載)

問題的提出&#xff1a;我們經常會需要用ansys計算一些東西&#xff0c;之后再用matlab來處理計算的結果。當修改某些參數重復上述過程的時候&#xff0c;就比較容易出現問題——比如ansys模型中的參數和matlab程序中參數的一致性問題等。這時可以考慮采用下面的協同工作的方法…

本地存儲之sessionStorage

源碼可以到GitHub上下載&#xff01; sessionStorage&#xff1a; 關閉瀏覽器再打開將不保存數據 復制標簽頁會連同sessionStorage數據一同復制 復制鏈接地址打開網頁不會復制seessionStorage內的數據 清除緩存加載當前頁對頁面無影響 1) 同源策略限制。若想在不同頁面之間對同…

哈希三道題

兩數之和 給定一個整數數組 nums 和一個整數目標值 target&#xff0c;請你在該數組中找出 和為目標值 target 的那 兩個 整數&#xff0c;并返回它們的數組下標。 你可以假設每種輸入只會對應一個答案。但是&#xff0c;數組中同一個元素在答案里不能重復出現。 你可以按任意…

zemax光學設計超級學習手冊_穿越十年的一個ZEMAX光學設計案例

目前超過兩千人的光學與光學設計方面的微信公眾號&#xff0c;歡迎您&#xff01;穿越十年的一個ZEMAX光學設計案例作者&#xff1a;窗臺小綠蘿CAD&#xff0c;這個詞已經深入到學習、工作很多年&#xff0c;翻譯過來就是Computer Aided Design&#xff0c;計算機輔助設計。隨著…

Java本質和性能

最初的問題是如何計算二進制數中1的個數&#xff1f; 我包含了使用Integer.bitCount&#xff08;&#xff09;的性能比較&#xff0c;該性能可以轉換為固有特性&#xff0c;即單個機器代碼指令POPCNT和執行相同功能的Java代碼。 題 如何計算二進制數中1的個數&#xff1f; 假…

spring RequestMapping 包含http的部分以及各部分詳解

RequestMapping有四個參數&#xff0c;分別為&#xff1a;1、value&#xff1a;表示請求URL2、method&#xff1a;表示請求方法3、params&#xff1a;表示請求參數4、headers&#xff1a;表示請求頭 【例如】&#xff1a;RequestMapping(value"/testRequestMapping",…

【ZBH選講·拍照】

【問題描述】 假設這是一個二次元。LYK召集了n個小伙伴一起來拍照。他們分別有自己的身高Hi和寬度Wi。為了放下這個照片并且每個小伙伴都完整的露出來&#xff0c;必須需要一個寬度為ΣWi&#xff0c;長度為max{Hi}的相框。&#xff08;因為不能疊羅漢&#xff09;。LYK為了節省…

php基礎是什么,php基礎學什么?

有不少同學想要學習 PHP&#xff0c;但又不清楚 PHP 基礎學什么&#xff0c;那么這篇文章告訴你。熟悉前端開發語言學習 PHP 之前&#xff0c;首先要學習前端語言包括 HTML、CSS、JS 等。等對前端語言有個大致掌握后&#xff0c;能編寫一個 web 靜態頁面。學習 PHP 基本語法和函…

名為 cursor_jinserted 的游標不存在_生鮮電商存在的問題及對策解析:未來生鮮電商如何發展?...

生鮮電商的特點有哪些&#xff1f;生鮮電商特點&#xff1a;1,生鮮電商具有粘性高、重復購買率高、毛利高的“三高”特性&#xff1b;2,生鮮食品需要保鮮、冷藏、冷凍&#xff1b;3,生鮮食品保質期比較短&#xff1b;保存不易、對物流配送的條件要求極高&#xff1b;4,生鮮商品…

遇到短信轟炸,別人換ip調你的短信接口怎么辦

前端開發者很容易暴露自己的請求地址和參數&#xff0c;我們都知道&#xff0c;一個h5頁面&#xff0c;按 F12 是可以看到頁面的源碼的&#xff0c;所以經常很多人會利用這一點惡意調取別人的接口。 我們公司出現了好多次短信接口被大量調用&#xff0c;導致一天發了幾萬條短信…

UVa 10170 - The Hotel with Infinite Rooms

題目&#xff1a;求從s開始的遞增序列&#xff08;每次加1&#xff09;。求出他們加和不小于D的那個最后的加數。 分析&#xff1a;數學題。分治。s s1 ... n n*&#xff08;n1&#xff09;/2 - s*&#xff08;s-1&#xff09;/2 &#xff08;ns&#xff09;*&#xff08;…

番石榴函數和Java 8 Lambdas

我最近閱讀了Brian Goetz的《 Lambda的狀況》 &#xff0c;在閱讀了該文章之后&#xff0c;我想嘗試使用Java 8 Lambda表達式。 Brian在他的文章中繼續描述了將一種方法稱為“功能”接口的接口。 功能接口幾乎總是用作匿名類&#xff0c;其中ActionListener是規范示例。 這些“…

linux rsync刪文件速度,為什么用rsync刪除大量文件的時候比用rm快

為什么用rsync刪除大量文件的時候比用rm快今天研究怎么在Linux下快速刪除大量文件&#xff0c;搜到很多人都說可以用rsync來刪除大量文件&#xff0c;速度比rm要快很多&#xff0c;但是沒有人說為什么&#xff0c;仔細研究了一下原因&#xff0c;總結起來大概就是&#xff0c;一…

關于源碼,反碼,補碼(正數--負數)---------(-128)自己的理解

以一個字節為例 1、無符號位&#xff0c;一個字節可以存放0~255共256個數字&#xff1b;有符號位存放-128~127共256個數字&#xff1b; 2、無符號全都表示為正數&#xff1b;有符號位則首位表示正負數&#xff0c;正數首位為0&#xff0c;負數首位為1&#xff08;因此在判斷一個…

英特爾x722網卡驅動_產品詳情 | 從核心到邊緣,英特爾加速5G網絡基礎設施建設...

英特爾近期宣布推出無可比擬的5G基礎設施芯片產品組合&#xff0c;包括一款面向無線基站的10納米片上系統(SoC)英特爾凌動P5900&#xff0c;和一款面向5G網絡處理的結構化ASIC&#xff0c;一款針對5G網絡優化、提供基于GPS的高精度網絡服務同步功能的以太網適配器。此外&#x…

canvas離屏技術與放大鏡實現

教程所示圖片使用的是 github 倉庫圖片&#xff0c;網速過慢的朋友請移步>>> &#xff08;原文&#xff09;canvas 離屏技術與放大鏡實現。 更多討論或者錯誤提交&#xff0c;也請移步。 利用canvas除了可以實現濾鏡&#xff0c;還可以利用離屏技術放大鏡功能。為了方…

虛擬機下安裝ubuntu后root密碼設置

問題描述&#xff1a; 在虛擬機下安裝了ubuntu中要輸入用戶名&#xff0c;一般情況下大家都會輸入一個自己的網名或綽號之類的&#xff0c;密碼也在這時設置過了。 但是當安裝成功之后&#xff0c;使用命令#su root&#xff0c;然后輸入剛才設置的密碼&#xff0c;發現密碼錯誤…

使用Ajax的Spring MVC REST調用

這篇文章提供了對Spring MVC Web應用程序的REST調用的簡單示例。 它基于在Spring MVC上下文示例中使用Spring MVC服務靜態資源和使用Ajax獲取JSON 。 該代碼可在GitHub的Spring-REST-With-Ajax目錄中找到。 主頁 我們的主頁包含與執行Ajax調用的Javascript函數鏈接的四個按鈕…