python 多型 鎖 python(多型,封裝)

2021-10-19 20:27:21 字數 4134 閱讀 2210

多型:由不同的類例項化得到的物件,呼叫同乙個方法,執行的邏輯不同。

# -*- 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...