第四章 面向对象
第四章 面向?qū)ο?/h2> 1. 基本格式
定義:當(dāng)函數(shù)(業(yè)務(wù)功能)比較多,可以使用面向?qū)ο髞?lái)進(jìn)行歸類,如果有一個(gè)凡事使用的公共值,也可以放到對(duì)象中
#格式&關(guān)鍵字 class 類名:def __inti__(self,x)self.x = xdef 方法名(self,name):print(self.name) v1 = 類(666) v1.方法('Parallel')#存儲(chǔ)一些值,方便之后使用 clas Foo:def __intit__(self,n,a,g):self.name = nself.age = aself.gender = gdef show(self):temp = '我是%s,年齡%s,性別%s'%(self.name,self.age,self.gender,)print(temp) p = Person('Parallrl',18,'男') #類()實(shí)例化對(duì)象,自動(dòng)執(zhí)行此類中的__init__方法 p.show()2. 三大特性
2.1 封裝
定義:將同一類的函數(shù)或重復(fù)使用的公共值封裝佛奧同一個(gè)類中,方便以后使用
2.2 繼承
定義:創(chuàng)建一個(gè)子類的對(duì)象,執(zhí)行對(duì)象.方法時(shí),優(yōu)先在自己的類中找,如果沒有就在父類中找,多個(gè)類中如果有公共的方法,可以放在基類中
注:繼承關(guān)系的查找順序,要注意self到底是哪個(gè)類創(chuàng)建的,就從此類開始找
#繼承 class Base: 父類(基類)def f1(self):pass class Foo(Base): 子類(派生類)def f2(self):pass obj = Foo()3. 類成員
方法(綁定方法/普通方法):至少有一個(gè)self參數(shù),先創(chuàng)建對(duì)象,由對(duì)象.方法()執(zhí)行
類方法:@classmethod,至少有一個(gè)參數(shù)cls,類.類方法()執(zhí)行
靜態(tài)方法:@staticmethod,參數(shù)無(wú)限制可以不傳參,可以不創(chuàng)建對(duì)象類.靜態(tài)方法名()執(zhí)行
類變量:寫在類的下一級(jí),和方法同級(jí),類/對(duì)象.類變量名稱調(diào)用
屬性:@property,把方法編程屬性,出去了self不能有其他參數(shù),用對(duì)象.屬性名調(diào)用,不需要加()
4. 成員修飾符
定義:公有&私有
#公有變量和私有變量 class Foo:def __init__(self,name):self.name = name #公共的self._name = name #私有的def func(self):print(self,name) obj = Foo('alex') print(obj.name) print(obj.__name) #外部訪問不到#訪問私有變量 class Foo:def __init__(self,name):self.__x = name obj = Foo('alex') print(obj._Foo__x) #強(qiáng)制訪問私有實(shí)例變量5. 特殊成員
#__init__:初始化方法,用于給對(duì)象賦值(默認(rèn)執(zhí)行)#__new__:構(gòu)造空對(duì)象,比__inti__優(yōu)先執(zhí)行#__call__:可以用類()()直接執(zhí)行call方法#__getitem__/__setitem__/__delitem__ class Foo:def __setitem__(self,key,value):print(key,value)def __getitem__(self,item):print(item)###xxxdef __delitem__(self,key):print(key)###ttt obj1 = Foo() obj1['k1'] = 123#內(nèi)部會(huì)自動(dòng)調(diào)用__setitem__方法 val = obj1['xxx'] #內(nèi)部會(huì)自動(dòng)調(diào)用__getitem__方法 print(val) del obj1['ttt']#內(nèi)部會(huì)自動(dòng)調(diào)用__delitem__方法#__str__:打印一個(gè)對(duì)象,當(dāng)__str__返回什么,對(duì)象就打印什么 class Foo(object):def __str__(self):return 'sdsdsa' obj = Foo() print(obj) #打印的是對(duì)象,類型也是對(duì)象,但答應(yīng)出來(lái)的是sdsdsa#__dict__:將要找的元素編程字典格式 class Foo(object):def __init__(self,name,age,email):self.name = nameswf.age = ageself.email = email obj = Foo('alex',19,'xxx@qq.com') val = obj.__dice__#去對(duì)象中找到所有變量轉(zhuǎn)換為字典 print(val) #{'name':'alex','age':19}#__enter__/__exit__:文件上下文管理 class Foo(object):def __enter__(self):self.x = open('a.txt',mode='a',encoding='utf-8')return self.xdef __exit__(self,exc_type,exc_val,exc_tb):self.x.close() with Foo() as ff:ff.write('alex')#對(duì)象互相加減乘除 class Foo(object):def __add__(self,other):pass obj1 = Foo() obj2 = Foo() val = obj1 +obj2###觸發(fā)add,前面觸發(fā),前面為self,后面為other6. 嵌套
定義:面向?qū)ο罂梢援?dāng)參數(shù)嵌套到函數(shù)中,類(Foo)可以為key對(duì)象(obj)可以做key
class Dream(object):def __init__(self,title,addr):self.title = titleself.address = addrclass House(object):def __init__(self,name,dream_object):self.name = nameself.dream =dream_objects1 = Dream('北京','沙河') s2 = Dream('上海','浦東') s3 = Dream('深圳','南山')c1 = House('Parallel',s1) c1.name c1.dream.title c1.dream.address7. 反射
#根據(jù)字符串的形式去某個(gè)對(duì)象中操作他的成員 class Foo:def login(self):pass obj = Foo() func_name = input('請(qǐng)輸入方法名:') getattr(obj,func_name)() #找到方法并執(zhí)行#根據(jù)字符串的形式去某個(gè)對(duì)象中判斷是否有該成員 class View(object):def login(self):return '登陸'def logout(self):return '登出'def index(self):return '首頁(yè)' obj = View() func_name = input('請(qǐng)輸入方法名:') if not hasattr(obj,func_name):print('輸入錯(cuò)誤') getattr(obj,func_name)()#根據(jù)字符串的形式去某個(gè)對(duì)象中設(shè)置成員 class Foo:pass obj = Foo() setattr(obj,'k1','123') #obj.k1 = '123' #設(shè)置對(duì)象成員 print(obj.k1)#根據(jù)字符串的形式去某個(gè)對(duì)象中刪除成員 class Foo:k1 = 999 obj = Foo() delattr(obj,'k1')8. 內(nèi)置函數(shù)
issubclass:判斷某個(gè)類是否是某個(gè)類的子類 print(issubclass(子類,父類)) 返回布爾值
isinstance:判斷對(duì)象是否是某個(gè)類或該類基類的實(shí)例 print(isinstance(obj,Foo)) 判斷obj是否是Foo或Foo基類的實(shí)例 返回布爾值
super:根據(jù)self對(duì)象所屬類的繼承關(guān)系,按順序挨個(gè)找并執(zhí)行,默認(rèn)找到第一個(gè)就不找了 v = super().xx()
9. 單例模式
定義:無(wú)論實(shí)例化多少次,都是用第一次創(chuàng)建的那個(gè)對(duì)象
class Foo(Object):instance = Nonedef __new__(cls,*args,**kwargs):if not instance:cls.instance = object.supper().__new__(cls)return cls.instance obj1 = Foo() obj2 = Foo() #不管啟動(dòng)多少個(gè)Foo內(nèi)存地址都指向obj1轉(zhuǎn)載于:https://www.cnblogs.com/parallel-Y/p/10921670.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
- 上一篇: URL中#号(井号)的作用
- 下一篇: 我该如何介绍我自己