多型:由不同的類例項化得到的物件,呼叫同乙個方法,執行的邏輯不同。
# -*- coding: utf-8 -*-
import abc
class animal(metaclass=abc.abcmeta):
#同一類事物:動物
@abc.abstractmethod
def talk(self):
pass
class cat(animal):
#動物的形態之一:貓
def talk(self):
print('喵喵喵')
class dog(animal):
#動物的形態之二:狗
def talk(self):
print('汪汪汪')
class pig(animal):
#動物的形態之三:豬
def talk(self):
print('哼哼哼')
#統一的介面
def talk(self):
self.talk()
#例項化
cat=cat()
dog=dog()
pig=pig()
talk(cat)
talk(dog)
talk(pig)
如上面不同的動物呼叫相同的函式,實現了不同的功能。
封裝在python中用雙下劃線開頭的方式將屬性隱藏起來。(單下劃線是開發者之間預設為內部屬性,外部不能使用)
以雙下劃線開頭的屬性python會自動重新命名。
類的繼承具有改變和多型的意義。多型就是類的這兩層意義的乙個具體的實現機制。
反射自省也稱作反射,這個性質展示了某物件是如何在執行期取得自身資訊的。如果傳乙個物件給你,你可以查出它有什麼能力,這是一項強大的特性。
# -*- coding: utf-8 -*-
class people:
#私有屬性
__star='earth'
def __init__(self,id,name,age,salary):
self.id=id
self.name=name
self.age=age
self.salary=salary
def get_id(self):
print(self.id)
p=people('bob',969,20,10000)
#asattr()檢測物件是否有某屬性,方法
print(hasattr(p,'name'))
print(hasattr(p,'get_id'))
#getattr()獲取物件屬性值,方法位址
print(getattr(p,'name'))
#setattr()新增,修改物件的屬性
setattr(p,'hobby','game')
print(p.__dict__)
#delattr()刪除物件的屬性
#del p.hobby
delattr(p,'hobby')
print(p.__dict__)
反射的意義:如以下不同功能開發者之間,即使某些功能未實現,也不影響其他開發者工作。
-*- coding: utf-8 -*-
class ftpclient:
'ftp客戶端功能具體實現'
def __init__(self,addr):
print('正在連線伺服器%s'%addr)
self.addr=addr
-*- coding: utf-8 -*-
f1=ftpclient('192.168.1.1')
if hasattr(f1,'get'):
func_get=getattr(f1,'get')
func_get()
else:
print('不存在此方法')
#包含字串的模組引用
module_1=__import__('c:/lib')
module_1.lib.func()
上面的的這個方法一直定位到頂級模組,下面的方法可以直接到你需要的模組
import importlib
m=importlib.import_module('c:/lib')
類的內建attr屬性
# -*- coding: utf-8 -*-
class foo():
pass
#檢視類的內建屬性
print(dir(foo))
class foo:
x=1def __init__(self,y):
self.y=y
def __getattr__(self, item):
print('----> from getattr:你找的屬性不存在')
def __setattr__(self, key, value):
print('----> from setattr')
# self.key=value #這就無限遞迴了,你好好想想
# self.__dict__[key]=value #應該使用它
def __delattr__(self, item):
print('----> from delattr')
# del self.item #無限遞迴了
self.__dict__.pop(item)
#__setattr__新增/修改屬性會觸發它的執行
f1=foo(10)
print(f1.__dict__) # 因為你重寫了__setattr__,凡是賦值操作都會觸發它的執行,你啥都沒寫,就是根本沒賦值,除非你直接操作屬性字典,否則永遠無法賦值
f1.z=3
print(f1.__dict__)
#__delattr__刪除屬性的時候會觸發
f1.__dict__['a']=3#我們可以直接修改屬性字典,來完成新增/修改屬性的操作
del f1.a
print(f1.__dict__)
#__getattr__只有在使用點呼叫屬性且屬性不存在的時候才會觸發
f1.******
三者的用法演示
二次加工標準型別(包裝)
意義:根據我們實際需要改寫內建方法與屬性。
# -*- coding: utf-8 -*-
if not isinstance(p_object,int):
raise typeerror('must be int')
@property
def mid(self):
'新增自己的屬性'
index=len(self)//2
return self[index]
l=list([1,2,3,4])
print(l)
print(l)
print(l.mid)
#其餘的方法都繼承list的
l.insert(0,-123)
print(l)
l.clear()
print(l)
授權授權的關鍵是__getattr__覆蓋方法
如下,重寫了write,新增了功能
# -*- coding: utf-8 -*-
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 %t')
self.file.write('%s %s' %(t,line))
def __getattr__(self, item):
return getattr(self.file,item)
f1=filehandle('b.txt','w+')
f1.write('你好啊\n')
time.sleep(1)
f1.write('早上好\n')
f1.seek(0)
print(f1.read())
f1.seek(1)
print(f1.read())
f1.close()
python有多型嗎 Python 多型
python多型 思維導圖 多型概念 一種事物具備多種 不同的形態 例如 水 固態 液態 氣態 官方解釋 多個不同類的物件可以響應同乙個方法,產生不同的結果 首先強調多型不是一種特殊的語法,而是一種狀態 特性 即多個不同物件可以響應同乙個方法,產生不同結果 好處 對於使用者而言,大大的降低了使用難度...
python 多型性 Python 多型
返回python教程首頁 多型介紹多型之前,我們先看看什麼叫方法重寫。方法重寫 子類繼承父類,會繼承父類的所有方法,當父類方法無法滿足需求,可在子類中定義乙個同名方法覆蓋父類的方法,這就叫方法重寫。當子類的例項呼叫該方法時,優先呼叫子類自身定義的方法,因為它被重寫了。例如 class people ...
python 多型應用 Python多型原理及實現
對於弱型別的語言來說,變數並沒有宣告型別,因此同乙個變數完全可以在不同的時間引用不同的物件。當同乙個變數在呼叫同乙個方法時,完全可能呈現出多種行為 具體呈現出哪種行為由該變數所引用的物件來決定 這就是所謂的多型 polymorphism 先看下面程式 class bird def move self...