python_面向对象
面向對象編程
?? ?object(對象)
?? ?什么是對象
?? ??? ?對象是指現實中的物體或實物
?? ?什么是面向對象
?? ??? ?把一切看成對象(實例),讓對象和對象之間建立關聯關系
?? ?對象都有什么特征
?? ??? ?對象有很多屬性(名詞),用變量記錄屬性
?? ??? ??? ?姓名,年齡,性別等
?? ??? ?對象有很多行為(動作,動詞),用函數(方法)表示行為
?? ??? ??? ?學習,吃飯,睡覺,踢球,工作
?? ?什么是類class:
?? ??? ?擁有相同屬性和行為的對象分為一組,即為一個類
?? ??? ?類是用來描述對象的工具,用類可以創建同類對象
?? ?類的創建語句:
?? ??? ?語法:class 類名(繼承列表):
?? ??? ??? ??? ?'''類的文檔字符串'''
?? ??? ??? ??? ?實例方法定義(類內的函數稱為方法method)
?? ??? ??? ??? ?類變量定義
?? ??? ??? ??? ?類方法定義
?? ??? ??? ??? ?靜態方法定義
?? ??? ?作用:
?? ??? ??? ?1、創建一個類
?? ??? ??? ?2、用于描述此類對象的行為和屬性
?? ??? ??? ?3、類用于創建此類的一個或多個對象(實例)
??? 類 和 對象
?? ??? ?類?? |?? ?? 對象????? 實例
?? ?? class? |? object?? instance
?? ?構造函數
?? ??? ?表達式:類名([創建傳參列表])
?? ??? ?作用:創建這個類的實例對象,并返回此實例對象的引用關系
?? ?實例(對象)說明
?? ??? ?實例有自己的作用域和名字空間,可以為該實例添加實例變量(屬性)
?? ??? ?實例可以調用類方法和實例方法
?? ??? ?實例可以訪問類變量和實例變量
?? ?實例方法:
?? ??? ?語法:calss 類名(繼承列表):
?? ??? ??? ??? ?def 實例方法名(self,參數1,參數2...):
?? ??? ??? ??? ??? ?'''實例方法的的文檔字符串'''
?? ??? ??? ??? ??? ?語句塊
?? ??? ?作用:用于描述一個對象的行為,讓此類型的全部對象都擁有相同的行為
?? ??? ?說明:
?? ??? ??? ?1、實例方法實質是函數,是定義在類內的函數
?? ??? ??? ?2、實例方法至少有一個形參,第一個形參代表調用這個方法的實例,一般命名為”self“
?? ??? ?實例方法的調用語法:
?? ??? ??? ?1、實例.實例方法名(調用傳參)
?? ??? ??? ?2、類名.實例方法名(實例,調用傳參)
??? 屬性 attribute(也叫實例變量)
?? ??? ?每個實例都可以有自己的變量,此變量稱為實例變量(也叫屬性)
?? ??? ?屬性的使用語法:實例名.屬性名
?? ??? ?賦值規則:
?? ??? ??? ?1、首次為屬性賦值,則創建此屬性
?? ??? ??? ?2、再次為屬性賦值,則必改變屬性的綁定關系
?? ??? ?作用:用來記錄對象自身的數據
??? 實例方法和實例變量(屬性)結合使用
class Dog:def eat(self,food):print("%s的%s正在吃%s"%(self.color,self.kinds,food)) dog1 = Dog() dog1.kinds = '京巴' #添加屬性kinds dog1.color = '白色' #添加屬性color dog1.eat("狗糧")#該語句不能放在kinds和color屬性被添加之前 dog2 = Dog() dog2.kinds = '哈士奇' #添加屬性kinds dog2.color = '黑色' #添加屬性color dog2.eat("包子") View Code??? 刪除屬性
?? ??? ?用del語句可以刪除一個對象的實例變量
?? ??? ?語法:
?? ??? ??? ?del 對象.實例變量名
?? ??? ?示例:
?? ??? ??? ?class Cat:
?? ??? ??? ??? ?pass
?? ??? ??? ?c1 = Cat()?? ??? ?#創建實例對象
?? ??? ??? ?c1.color = "白色"#添加屬性
?? ??? ??? ?del c1.color? ??? ?#刪除屬性
?? ??? ??? ?print(c1.color)#屬性錯誤
?? ?初始化方法:
?? ??? ?作用:對新創建的對象添加實例變量(屬性)或相應的資源
?? ??? ?語法:
?? ??? ??? ?class 類名(繼承列表):
?? ??? ??? ??? ?def __init__(self[,形參列表]):
?? ??? ??? ??? ??? ?語句塊
?? ??? ?說明:
?? ??? ??? ?1、初始化方法名必須為__init__不可改變
?? ??? ??? ?2、初始化方法會在構造函數創建實例后自動調用,且將實例自身通過第一個參數self傳入__init__方法
?? ??? ??? ?3、構造函數的實參將通過__init__方法的形參傳入__init__方法中
?? ??? ??? ?4、初始化方法內部如果需要返回,則只能返回None
? 析構方法:
?? ??? ?語法:class 類名(繼承列表):
?? ??? ??? ?def __del__(self):
?? ??? ??? ??? ?語句塊
?? ??? ?說明:析構方法在對象銷毀時被自動調用
?? ??? ?作用:清理此對象所占用的資源
?? ??? ?python不建議在析構方法中做任何事情,因為對象銷毀的時間難以確定
?? ?預置實例屬性:
?? ??? ?__dict__屬性:
?? ??? ??? ?此屬性綁定一個存儲此實例自身實例變量(屬性)的字典,也可以存儲類中的變量,文檔字符串,方法
?? ??? ?示例:
?? ??? ??? ?class Dog():
?? ??? ??? ??? ?pass
?? ??? ??? ?dog = Dog()
?? ??? ??? ?print(dog.__dict__)#{}
?? ??? ??? ?dog.kinds = "aa"
?? ??? ??? ?print(dog.__dict__)#{"kinds":"aa"}
?? ??? ??? ?dog.__dict__["color"]= "red"
?? ??? ?__class__屬性:
?? ??? ??? ?此屬性用來綁定創建此實例的類
?? ??? ??? ?作用:可以借助此屬性來訪問創建此實例的類
?? ??? ??? ?示例:
?? ??? ??? ??? ?class Dog()
?? ??? ??? ??? ??? ?pass
?? ??? ??? ??? ?dog1=Dog()
?? ??? ??? ??? ?dog2 = dog1.__class__()#等同于dog2 = Dog()
?? ? 面向對象的綜合示例
?? ? ?? ?有兩個人:
?? ? ?? ??? ?1、姓名:張三? 年齡:35
?? ? ?? ??? ?2、姓名:李四? 年齡:38
?? ? ?? ?行為:
?? ? ?? ??? ?1、交別人學東西teach
?? ? ?? ??? ?2、賺錢
?? ? ?? ??? ?3、借錢
?? ? ?? ?事情:
?? ? ?? ??? ?張三 教 李四 學 python
?? ? ?? ??? ?李四 教 張三 學 跳皮筋
?? ? ?? ??? ?張三 上班賺了 1000 元錢
?? ? ?? ??? ?李四 向 張三 借了 200 元錢
?? ? 用于判斷類的函數:
?? ? ?? ?isinstance(obj,class_or_tuple)返回一個對象obj是否為某個類class或某些類的實例,如果是返回True,否則返回False
?? ? ?? ?type(obj)?? ?返回對象的類型
?? ? 示例:
?? ? ?? ??? ?class Dog:
?? ? ?? ??? ??? ?pass
?? ? ?? ??? ?class Cat:
?? ? ?? ??? ??? ?pass
?? ? ?? ??? ?animal = Dog()
?? ? ?? ??? ?isinstance(animal,Dog) #True
?? ? ?? ??? ?isinstance(animal,Cat) #False
?? ? ?? ??? ?isinstance(animal,(Cat,int,list)) #False
?? ? ?? ??? ?isinstance(animal,(Cat,int,list,Dog)) #True
類變量 class variable(也叫類屬性):
?? ?類變量是類的屬性,此屬性屬于類
?? ?作用:用來記錄類的相關數據
?? ?說明:
?? ??? ?1、類變量可以通過類直接訪問
?? ??? ?2、類變量可以通過類的實例直接訪問
?? ??? ?3、類變量可以通過類的實例的__class__屬性訪問
?? ?實例:
?? ??? ?class Human:
?? ??? ??? ?count = 0 #創建類變量
??? 類變量的應用案例:
?? ??? ?用類變量來記錄對象的個數
類的文檔字符串:
?? ?類內的一個沒有賦值給任何變量的字符串是類的文檔字符串
?? ?說明:
?? ??? ?1、類的文檔字符串用類的__doc__屬性可以訪問
?? ??? ?2、類的文檔字符串可以用help()函數查看
類的__slots__列表:
?? ?作用:限定一個類的實例只能有固定的屬性(實例變量),通常為了防止錯寫屬性名而發生運行時錯誤
?? ?說明:含有__slots__列表的類創建的實例對象沒有__dict__屬性,即此實例不用字典來保存對象的屬性(實例變量)
類方法 @classmethod
?? ?類方法是描述類的行為的方法,類方法屬于類
?? ?說明:
?? ??? ?1、類方法需要用@classmethod裝飾器定義
?? ??? ?2、類方法至少有一個形參,第一個形參用于綁定類,約定寫為‘cls’
?? ??? ?3、類和該類的實例都可以調用類方法
?? ??? ?4、類方法不能訪問此類創建的實例的屬性(只能訪問類變量)
問題:
?? ?1、類方法屬于類
?? ?2、實例方法屬于該類的實例
?? ?3、類內能不能有函數,既不屬于類又不屬于類的實例?
靜態方法 @staticmethos
?? ?靜態方法不屬于類,也不屬于類的實例,它相當于定義在類內的普通函數,只是它的作用域屬于類
?繼承 inheritance 和? 派生? derived
?? ?什么是繼承/派生
?? ??? ?1、繼承是指從已有的類中衍生出新類,新類具有原有類的行為和屬性,并能擴展新的行為和屬性
?? ??? ?2、派生就是從一個已有類中衍生(創建)新類,在新類上可以添加新的屬性和行為
?? ?繼承和派生的目的:
?? ??? ?1、繼承是延續舊類的功能
?? ??? ?2、派生是為了在舊類的基礎上添加新的功能
?? ?作用:
?? ??? ?1、用繼承派生機制,可以將一些共有功能加在基類中,實現代碼的共享
?? ??? ?2、在不改變基類的基礎上改變原有的功能
?? ?繼承/派生的名詞:
?? ??? ?基類(base class),超類(super class),父類(father class)
?? ??? ?派生類(derived class),子類(child class)
?? ?單繼承:
?? ??? ?語法:class 類名( 基類名):
?? ??? ??? ??? ?語句塊
?? ??? ?說明:單繼承是指派生類由一個基類衍生出來的類
?? ?繼承說明:
?? ??? ?1、任何類都直接或間接的繼承自object類
?? ??? ?2、object類是一切類的超類(祖類)
?? ?類的__base__屬性:
?? ??? ?__base__屬性用來記錄此類的基類
?? ??? ?說明:類名.__base__ 返回的是繼承的第一個類
?? ?覆蓋 override:
?? ??? ?什么是覆蓋:
?? ??? ??? ?覆蓋是指在有繼承關系的類中,子類中實現了與基類同名的方法,在子類實例調用該方法時,實例調用的是子類中的覆蓋版本的方法,這種現象叫做覆蓋
?? ?問題:當覆蓋發生時,子類對象能否訪問父類中的方法?
?? ??? ?子類對象顯式調用基類方法的方式:
?? ??? ??? ?基類名.方法名(實例,實際調用傳參)
?? ??? ?super 函數:
?? ??? ??? ?super(type,obj) 返回綁定超類的實例
?? ??? ??? ?super() 返回綁定超類的實例,等同于:super(__class__,實例方法的第一個參數,必須在方法內調用)
??? 顯示調用基類的初始化方法:
?? ??? ?當子類中實現了__init__方法時,基類的__init__方法并不會被調用,此時需要顯式調用
用于類的函數:
?? ?issubclass(cls,class_or_tuple):
?? ??? ?判斷一個類是否繼承自其它的類,如果此類cls是class或tuple中的一個派生子類則返回True,否則返回False
?? ?說明:cls是class的子類的子類...也返回True
查看python內建類的繼承關系的方法:
?? ?help(__bulitins__)
封裝 enclosure
?? ?1、封裝是指隱藏類的實現細節,讓使用者不用關心這些細節
?? ?2、封裝的目的是讓使用者盡可能少的使用實例變量(屬性)進行操作
私有屬性:
?? ?python類中,以雙下劃線“__”開頭的,不以雙下劃線結尾的標識符為私有成員,在類的外部無法直接訪問
多態 polymorphic
?? ?字面意思:“多種狀態”
?? ?多態是指在繼承/派生關系的類中,調用基類對象的方法,實際能調用子類的覆蓋版本方法的現象叫多態
?? ?說明:
?? ??? ?多態調用的方法與對象相關,不與類型相關
?? ??? ?Python的全部對象都只有“運行時狀態(動態)”,沒有“C++/Java”里的“編譯時狀態(靜態)”
面向對象的編程語言的特征:
?? ?繼承
?? ?封裝
?? ?多態
?? ?如:C++(支持多繼承)/ Java /Python(支持多繼承)/Swift /C#
多繼承 multiple inheritance
?? ?多繼承是指一個子類繼承自兩個或兩個以上的基類
?? ?語法:
?? ??? ?class 類名(基類名1,基類名2....):
?? ??? ??? ?語句塊
?? ?說明:
?? ??? ?1、一個子類同時繼承自多個父類,父類中的方法可以同時被繼承下來
?? ??? ?2、如果兩個父類中有同名的方法,而在子類中又沒有覆蓋此方法時,調用結果難以確定
?? ?多繼承的問題(缺陷):
?? ??? ?標識符(名字空間沖突的問題)
?? ??? ??? ?要謹慎使用多繼承
多繼承的MRO(Method Resolution Order)問題:
?? ?類內的__mro__屬性用來記錄繼承方法的查找順序
函數重寫 override:
?? ?重寫是在自定義的類內添加相應(內建函數的方法)的方法,讓自定義的類生成的對象(實例)像內建對象一樣進行內建的函數操作
? 對象轉化為字符串函數重寫
?? ??? ?repr(obj)返回一個代表此對象的表達式字符串,通常:eval(repr(obj)) == obj
?? ??? ?str(obj)通過給定的對象返回一個字符串(這個字符串通常是給人看的)
對象轉字符串函數的重寫方法:
?? ?repr()函數的重寫方法:
?? ??? ?def __repr__(self):
?? ??? ??? ?return 能夠表達self內容的字符串(可以通過eval()方法反推)
?? ?str()函數的重寫方法:
?? ??? ?def __str__(self):
?? ??? ??? ?return 人能看懂的字符串
?? ?說明:
?? ??? ?1、str(obj)函數優先調用obj.__str__()方法返回字符串
?? ??? ?2、如果obj沒有__str__()方法,則調用obj.__repr__()方法返回的字符串
?? ??? ?3、如果obj沒有__repr__()方法,則調用object類的__repr__()實例方法顯示<XXXXX>格式的字符串
4、print(對象)相當于print(str(對象)),一個對象(實例)就是首先尋找__str__方法,在尋找__repr__方法
數值轉換函數的重寫:
?? ?def __complex__(self)?? ??? ?? complex(obj)函數調用
?? ?def __int__(self)?? ??? ??? ??? ? ? int(obj)函數調用
?? ?def __float__(self)?? ??? ??? ??? ?float(obj)函數調用
?? ?def __bool__(self)?? ??? ??? ??? ?bool(obj)函數調用
內建函數的重寫:
?? ?__abs__??? ??? ??? ??? ??? ??? ? ?? abs(obj)
?? ?__len__?? ??? ??? ??? ??? ??? ??? ?? len(obj)
?? ?__reversed__?? ??? ??? ??? ??? ? reversed(obj)
?? ?__round__?? ??? ??? ??? ??? ??? ?? round(obj)
布爾測試函數的重寫:
?? ?格式:def? __bool__(self):
?? ??? ??? ? ....
?? ?作用:
?? ??? ?1、用于bool(obj)函數取值
?? ??? ?2、用于if語句真值表達式中
?? ??? ?3、用于while語句真值表達式中
?? ?說明:
?? ??? ?1、優先調用__bool__方法取值
?? ??? ?2、如果不存在__bool__方法,則用__len__()方法取值,后判斷是否為零值,如果不為零返回True,否則返回False
?? ??? ?3、如果再沒有__len__方法,則直接返回True
迭代器(高級):
?? ?什么是迭代器
?? ??? ?可以通過next(it)函數取值的對象就是迭代器
?? ?迭代器協議:
?? ??? ?迭代器協議是指對象能夠使用next函數獲取下一項數據,在沒有下一項數據是觸發StopIterator來終止迭代的約定
?? ?實現方法:
?? ??? ?類內需要有__next__(self)方法來實現迭代器協議
?? ?語法形式:
?? ??? ?class MyIterator:
?? ??? ??? ?def __next__(self):
?? ??? ??? ??? ?迭代器協議的實現
?? ??? ??? ??? ?return 數據
什么是可迭代對象:
?? ?1、是指能用iter(obj)函數返回迭代器的對象(實例)
?? ?2、可迭代對象內部一定要定義__iter__(self)方法來返回迭代器
可迭代對象的語法形式:
?? ?class MyIterable:
?? ??? ?def __iter__(self):
?? ??? ??? ?語句塊
?? ??? ??? ?return 迭代器
?對象的屬性管理函數:
?? ?1、getattr(obj,name[,dafault])?? ?從一個對象得到對象的屬性;gettattr(x,'y')等同于x.y;當屬性y不存在時,如果有default參數,則返回default,如果沒有給出default則產生一 個AttributeError錯誤
?? ?2、hasattr(obj,name)?? ? 用給定的name返回obj是否有屬性,如果有返回True,否則返回False,此種做法可以避免在getattr(obj,name)時引發錯誤
?? ?3、setattr(obj,name,value)? 給對象obj的名為name的屬性設置相應的值value,setattr(x,'y',v)等同于x.y = v
?? ?4、delattr(obj,name) 刪除對象obj中的name屬性,delattr(x,'y')等同于del x.y
運算符重載:
?? ?什么是運算符重載
?? ??? ?讓自定義的類生成的對象(實例)能夠使用運算符進行操作
?? ?作用:
?? ??? ?1、讓自定義的類的實例像內建對象一樣運行運算符操作
?? ??? ?2、讓程序簡潔易讀
?? ??? ?3、對自定義的對象,將運算符賦予新的運算規則
算術運算符的重載:
?? ?__add__(self, rhs)?? ??? ??? ?self +? rhs?? ??? ??? ? 加法
?? ?__sub__(self, rhs)?? ??? ??? ?self -? rhs?? ??? ??? ? 減法
?? ?__mul__(self, rhs)?? ??? ??? ?self *? rhs?? ??? ??? ? 乘法
?? ?__truediv__(self, rhs)?? ??? ?self /? rhs?? ??? ??? ? 除法
?? ?__floordiv__(self, rhs)?? ??? ?self // rhs?? ??? ??? ? 地板出法
?? ?__mod__(self, rhs)?? ??? ??? ?self %? rhs?? ??? ??? ? 求余
?? ?__pow__(self, rhs)?? ??? ??? ?self ** rhs?? ??? ??? ? 冪運算
?? ?注意:rhs(right hands side )右手邊
反向算數運算符的重載:
?? ?當左手邊的類型為內建類型,右手邊為自定義類型時,要實現運算必須用以下方法重載
?? ?__radd__(self, lhs)?? ??? ??? ?lhs +? self?? ??? ??? ? 加法
?? ?__rsub__(self, lhs)?? ??? ??? ?lhs -? self?? ??? ??? ? 減法
?? ?__rmul__(self, lhs)?? ??? ??? ?lhs *? self?? ??? ??? ? 乘法
?? ?__rtruediv__(self, lhs)?? ??? ?lhs /? self?? ??? ??? ? 除法
?? ?__rfloordiv__(self, lhs)?? ?lhs // self?? ??? ??? ? 地板出法
?? ?__rmod__(self, lhs)?? ??? ??? ?lhs %? self?? ??? ??? ? 求余
?? ?__rpow__(self, lhs)?? ??? ??? ?lhs ** self?? ??? ??? ? 冪運算
符合賦值運算符的重載:
?? ?__iadd__(self, rhs)?? ??? ??? ?self +=? rhs?? ??? ??? ? 加法
?? ?__isub__(self, rhs)?? ??? ??? ?self -=? rhs?? ??? ??? ? 減法
?? ?__imul__(self, rhs)?? ??? ??? ?self *=? rhs?? ??? ??? ? 乘法
?? ?__itruediv__(self, rhs)?? ??? ?self /=? rhs?? ??? ??? ? 除法
?? ?__ifloordiv__(self, rhs)?? ?self //= rhs?? ??? ??? ? 地板出法
?? ?__imod__(self, rhs)?? ??? ??? ?self %=? rhs?? ??? ??? ? 求余
?? ?__ipow__(self, rhs)?? ??? ??? ?self **= rhs?? ??? ??? ? 冪運算
比較運算符的重載:
?? ?__lt__(self,rhs)?? ??? ??? ?self <?? rhs?? ??? ??? ? 小于
?? ?__le__(self,rhs)?? ??? ??? ?self <=? rhs?? ??? ??? ? 小于等于
?? ?__gt__(self,rhs)?? ??? ??? ?self >?? rhs?? ??? ??? ? 大于
?? ?__ge__(self,rhs)?? ??? ??? ?self >=? rhs?? ??? ??? ? 大于等于
?? ?__eq__(self,rhs)?? ??? ??? ?self ==? rhs?? ??? ??? ? 等于
?? ?__ne__(self,rhs)?? ??? ??? ?self !=? rhs?? ??? ??? ? 不等于
?? ?注:比較運算符通常返回True 或 False
?? ??? ?lt:less than??????? le:less or equal
?? ??? ?gt:greater than?? ??? ?gt:gerater or equl
?? ??? ?eq:equal?? ??? ??? ?ne:not equal
位運算符重載:
?? ?__invert__(self)?? ??? ??? ?~ self?? ??? ??? ??? ??? ?取反(一元運算符)
?? ?__and__(self,rhs)?? ??? ??? ?self? & rhs?? ??? ??? ??? ?位與
?? ?__or__(self,rhs)?? ??? ??? ?self? | rhs?? ??? ??? ??? ?位或
?? ?__xor__(self,rhs)?? ??? ??? ?self? ^ rhs?? ??? ??? ??? ?位異或
?? ?__lshift__(self,rhs)?? ??? ?self? << rhs?? ??? ??? ?左移
?? ?__rshift__(self,rhs)?? ??? ?self? >> rhs?? ??? ??? ?右移
反向位運算符重載:
?? ?__rand__(self,lhs)?? ??? ??? ?lhs? & self?? ??? ??? ??? ?位與
?? ?__ror__(self,lhs)?? ??? ??? ?lhs? | self?? ??? ??? ??? ?位或
?? ?__rxor__(self,lhs)?? ??? ??? ?lhs? ^ self?? ??? ??? ??? ?位異或
?? ?__rlshift__(self,lhs)?? ??? ?lhs << self?? ??? ??? ??? ?左移
?? ?__rrshift__(self,lhs)?? ??? ?lhs >> self?? ??? ??? ??? ?右移
?? ?注:當左手邊的類型為內建類型,右手邊為自定義類型時,使用反向位運算符重載
復合賦值位運算符:
?? ?__iand__(self,lhs)?? ??? ??? ?lhs? &= self?? ??? ??? ??? ?位與
?? ?__ior__(self,lhs)?? ??? ??? ?lhs? |= self?? ??? ??? ??? ?位或
?? ?__ixor__(self,lhs)?? ??? ??? ?lhs? ^= self?? ??? ??? ??? ?位異或
?? ?__ilshift__(self,lhs)?? ??? ?lhs <<= self?? ??? ??? ??? ?左移
?? ?__irshift__(self,lhs)?? ??? ?lhs >>= self?? ??? ??? ??? ?右移
一元運算符的重載:
?? ?__neg__(self)?? ??? ??? ??? ?- self?? ??? ??? ??? ??? ??? ?負號
?? ?__pos__(self)?? ??? ??? ??? ?+ self?? ??? ??? ??? ??? ??? ?正號
?? ?__invert__(self)?? ??? ??? ?~ self?? ??? ??? ??? ??? ??? ?取反
?? ?一元運算符的重載方法:
?? ??? ?class 類名:
?? ??? ??? ?def __XXX__(self):
?? ??? ??? ??? ?....
運算符重載說明:
?? ?運算符重載不能改變運算符的優先級
python類名最好用駝峰命名法:
?? ?MyList?? MyRange?? ??? ?大駝峰(所有單詞首字母大寫,其余小寫)
?? ?getStudentAge?? ??? ??? ?小駝峰(第一個單詞首字母小寫,其他首字母大寫)
in /not in 運算符的重載:
?? ?重載方法:
?? ??? ?def __contanins__(self,e)?? ??? ?e in self???? 成員運算
索引和切片運算符的重載:
?? ?__getitem__(self,i)?? ??? ?x = self[i]?? ??? ?索引和切片取值
?? ?__setitem__(self,i,v)?? ?self[i] = v???? 索引和切片賦值
?? ?__delitem__(self,i)?? ??? ?del self[i]?? ??? ?del 語句刪除索引
?? ?作用:讓自己定義的類型的對象能夠支持索引和切片操作
slice函數:
?? ?作用:用于創建一個Slice切片對象,此對象存儲一個切片的起始值,終止值和步長信息
?? ?slice(start,stop=None,step=None) 創建一個切片對象
?? ?slice的對象的屬性:
?? ??? ?s.start?? ??? ??? ??? ?切片的起始值,默認為None
?? ??? ?s.stop?? ??? ??? ??? ?切片的終止值,默認為None
?? ??? ?s.step?? ??? ??? ??? ?切片的步長,默認為None
?類的特殊成員
1、__call__()方法
class Foo:def __init__(self):print("init")def __call__(self):print("call")Foo()()#首先會執行__init__()方法,再執行__call__()方法 obj = Foo()#執行__init__()方法 obj()#執行__call__()方法?metaclass(類的祖宗)
1、Python中一切事物都是對象
2、class Foo:
pass
obj = Foo()
#obj是對象,Foo類的對象
#Foo類也是一個對象,type的對象
3、類都是type類的對象,type(...)
def function(self):print("hello world") #創建一個Foo類繼承object,含有func()方法 Foo = type("Foo",(object,),{'func':function}) obj = Foo()obj.func()?
class MyType(type):def __init__(self,*args,**kwargs):super().__init__(*args,**kwargs)#執行父類type的__init__方法print("MyType的__init__")def __call__(self):print("MyType的__call__")obj = self.__new__(self)#self代表Foo,第三步調用Foo中的new方法,返回Foo的對象self.__init__(obj)#第四步調用Foo中的__init__方法class Foo(object,metaclass=MyType):#第一步,編譯器執行到此處是會調用MyType的__init__方法def __init__(self):print("Foo的__init__")def __new__(cls,*args,**kwargs):print("Foo中的__new__方法")return object.__new__(cls,*args,**kwargs)#真正創建Foo類的對象的地方 obj = Foo()#第二步,在Foo類(MyTpye類的對象)加(),會執行MyType中的__call__方法?
?
?
?
?
轉載于:https://www.cnblogs.com/xdl-smile/p/9346948.html
總結
以上是生活随笔為你收集整理的python_面向对象的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python day-15 匿名函数
- 下一篇: Mac python3.x使用HTMLT