=======================================概念===========================================
1.多態
多態是指對象通過他們共同的屬性和動作來操作及訪問,而不需要考慮他們具體的類
多態指的是一類事物有多種形態,(一個抽象類有多個子類,因而多態的概念依賴於繼承)
PYthon的三大特性:繼承,封裝,多態
不同的對象調用相同的方法就是多態的體現,多態就是繼承的一種體現方式,多態就是繼承的實現細節
2.封裝
類就是麻袋:
裝:把亂七八糟的一起裝進麻袋
封:封就是把麻袋封上口子
在面向對象裏面麻袋就是類,類和對象封裝了本身的數據屬性,
真正意義上的封裝:明確區分內外,
第一層面:類就是麻袋,本身就是一種封裝
第二層面:類中定義私有屬性,只能在內部使用,外部無法訪問
3.繼承
類的繼承:1.改變 2.擴展
多態就是類的這兩層意義的一個具體表現,調用不同的實例對象來
4.面向對象的優點
從編程的理論得知,面向對象是一種更高級的結構化編程方式,他的好處是兩點
1:通過封裝明確內外,你的作爲類的締造者,你是上帝,上帝造物的邏輯你的無需知道,
2.通過繼承+多態在語言層面支持歸一體設計
注意:不用面嚮對象語言(class),一樣可以做歸一化(如老掉的文件概念,遊戲行業的一切皆精靈)一樣可以封裝(通過定義模塊和接口),只是用面嚮對象語言可以直接用語言元素顯示聲明這些而已,
而用了面嚮對象語言,滿篇class,並不等於就有啦歸一化的設計,甚至,因爲被這些花哨的東西迷惑,反而更加不知道什麼纔是設計
5.Python中關於OOP的常用術語
抽象/實現
6.反射
反射的概念:程序可以通過訪問。檢測,和修改它本身轉態或行爲
4個函數實現
反射只有在實例調用的時候才能被使用,
hasattr
setattr
getattr
delattr
hasattr(object,'name') ->>object.name #可以加上默認值,找不到的情況下提示什麼
getattr(object,'name',default='xxx') -->>object.name 找不到屬性觸發
setattr(object,'name','egon') ->>object.name='egon' 設置屬性的時候觸發
delattr(object,'name') -->>del object.name
7.包裝
包裝是將原有的方法進行添加,修改,刪除原來的產品的功能,其他的保持原樣,授權的過程,即是所以的功能都是由新類的某部分來處理,但已存在的功能就授權給對象的默認屬性
實際上授權的關鍵點就是覆蓋 __getattr()的方法
========================================封裝===========================================
class People():
_start='earth_start'
__star='earth__star'
def __init__(self,id,name,age,salary):
print('---->>>>',self.__star)
self.id=id
self.name=name
self.age=age
self.salary=salary
def get_id(self):
print('我是私有方法,我找的id 是【%s】'%self.id)
def get_star(self):
print(self._start)
print(self.__star)
#print(People.__dict__)
p1=People('125233','olen','18',181202)
p1.get_id()
# print(p1._start)
# # _ 下劃線隱藏起來的
# #print(p1.__star)
# print(p1.__dict__)
# print(People._start)
# print(People.__dict__)
p1.get_star()
========================================ftp_client=====================================
class FtpClient():
'這是一個ftp 客戶端,但是沒有具體的功能'
def __init__(self,addr):
print('正在連接服務器【%s】'%addr)
self.addr=addr
def put(self):
print('正在上傳文件')
========================================動態導入模塊====================================
from m1 import t #m1/t
# module_t=__import__('m1.t')
# print(module_t)
# from m1.t import test1,_test2
# #from m1.t import *
#
# test1()
# _test2()
# module_t1=__import__('m1.t')
# print(module_t1)
#
# import importlib
# m=importlib.import_module('m1.t')
# print(m)
# m.test1()
========================================包裝標準類型====================================
class List(list):
def append(self, p_object):
if type(p_object) is str:
#list.append(self,p_object)
super().append(p_object)
else:
print('只能添加字符串類型')
def show_madle(self):
mid_index=int(len(self)/2)
return self[mid_index]
l1=List('helloworld')
# l2=list('hello world')
# print(l2,type(l2))
# print(l1,type(l1))
# print(l1.show_madle())
l1.append('hello')
print(l1)
========================================雙下劃線開頭的attr方法===========================
class Foo():
def __init__(self,name):
self.name=name
def __getattr__(self, item):
print('你的屬性【%s】不存在'%item)
def __setattr__(self, key, value):
print('執行setattr',key,value)
if type(value) is str:
print('開始設置')
self.__dict__[key]=value
else:
print('必須是字符串')
def __delattr__(self, item):
print('刪除屬性',item)
self.__dict__.pop(item)
f1=Foo('alex')
f1.age=18
f1.gender='male'
print(f1.__dict__)
# print(f1.age)
# print(f1.name)
#print(dir(f1))
del f1.name
print(f1.__dict__)
========================================反射============================================
class BlackMedium:
feture='ugly'
def __init__(self,name,addr):
self.name=name
self.addr=addr
def sell_hourse(self):
print('【%s】正在賣房子,傻逼纔買'%self.name)
def rent_house(self):
print('【%s】正在租房子,傻逼才租房子' % self.name)
b1=BlackMedium('萬成置地','天露園')
# print(hasattr(b1,'name'))
# print(getattr(b1,'name'))
# print(getattr(b1,'named','沒有這個參數'))
# b1.sb=True
# setattr(b1,'ab',True)
# setattr(b1,'ab1',123)
# setattr(b1,'name',"SB")
# print(b1.__dict__)
# delattr(b1,'sb')
# print(b1.__dict__)
setattr(b1,'fuc',lambda x:x+1)
print(b1.__dict__)
print(b1.fuc(8))
========================================多態===========================================
class H2O():
def __init__(self,name,temperature):
self.name=name
self.temperature=temperature
def turn_ice(self):
if self.temperature < 0:
print('%s 溫度太低結冰啦'%self.name)
elif self.temperature > 0 and self.temperature < 100:
print('%s 液化成水'%self.name)
elif self.temperature > 100:
print('%s 溫蒂太高成水蒸氣'%self.name)
class Water(H2O):
pass
class Ice(H2O):
pass
class Steam(H2O):
pass
w1=Water('水',25)
i1=Ice('冰',-20)
s1=Steam('蒸汽',3000)
w1.turn_ice()
i1.turn_ice()
s1.turn_ice()
#全部的數據類型都是繼承於type()
#運行時候的綁定狀態
def func():
pass
func()
========================================封裝示範一======================================
#_*_coding:utf-8_*_
__author__ = 'Linhaifeng'
class Room:
def __init__(self,name,owner,width,length,high):
self.name=name
self.owner=owner
self.__width=width
self.__length=length
self.__high=high
def tell_area(self): #此時我們想求的是面積
return self.__width * self.__length *self.__high
def tell_width(self):
return self.__width
r1=Room('衛生間','alex',100,100,10000)
# arear=r1.__width * r1.__length
print(r1.tell_area())
========================================授權===========================================
day26多態
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.