-
調用父類的方法用super()
查看全部 -
fqgqe ef
查看全部 -
類的特性:
封裝性
繼承
多態(tài)
查看全部 -
函數(shù)和方法最大的區(qū)別在于:
函數(shù)僅僅是一段供人調用代碼串,處于游離狀態(tài):
而方法,是依附于某個類中,供其他程序調用
查看全部 -
設置對象屬性:通常不必定義,調用從父類繼承的方法
def?__setattr__(self,?name,?value): ????self.__dict__[name]?=?value
查詢對象屬性:
__getattr__(self, name):訪問屬性在默認情況下沒有被查詢到的情況下調用
__getattribute__(self, name):每次訪問屬性一定會調用,容易引起無限遞歸,最好調用父類的getattribute
刪除對象屬性
__delattr__(self, name)
class?Programer(object): ????def?__init__(self,?name,?age): ????????self.name?=?name ????????self.age?=?age ???????? ????def?__getattribute__(self,?name): ????????return?super(Programer,?self).__getattribute__(name) ???????? ????def?__setattr__(self,?name,?value): ????????self.__dict__[name]?=?value ????? if?__name__?=?'__main__': ????p?=?Programer('Albert',?25) ????print?n.name
查看全部 -
在print的過程中,將對象轉換為字符串,包括三種方法:
__str__:轉換成適合人看的字符串
__repr__:轉換成適合機器看的字符串
__unicode__
展現(xiàn)對象屬性:__dir__
class?Programer(object): ????def?__init__(self,?name,?age): ????????self.name?=?name ????????if?isinstance(age,?int): ????????????self.age?=?age ????????else: ????????????raise?Exception('age?must?be?int') ????def?__str__(self): ????????return?'%s?is?%s?years?old'?%?(self.name,?self.age) ???????? ????def?__dir__(self): ????????return?self.__dict__.keys() ???????? if?__name__?=?'__main__': ????p?=?Programer('Albert',?25) ????print?p ????print?dir(p)
查看全部 -
比較運算符
__cmp__(self, other):包括以下所有比較情況
__eq__(self, other):判斷等于情況
__lt__(self, other):判斷小于情況
__gt__(self, other):判斷大于情況
數(shù)字運算符
__add__(self, other):加
__sub__(self, other):減
__mul__(self, other):乘
__div__(self, other):除
邏輯運算符
__or__(self, other):或
__and__(self, other):與
class?Programer(object): ????def?__init__(self,?name,?age): ????????self.name?=?name ????????if?isinstance(age,?int): ????????????self.age?=?age ????????else: ????????????raise?Exception('age?must?be?int') ???????????? ????def?__eq__(self,?other): ????????if?isinstance(other,?Programer): ????????????if?self.age?==?other.age: ????????????????return?True ????????????else: ????????????????return?False ????????else: ????????????raise?Exception('the?type?of?object?must?be?Programer') ???????????? ????def?__add__(self,?other): ????????if?isinstance(other,?Programer): ????????????return?self.age?+?other.age ????????else: ????????????raise?Exception('the?type?of?object?must?be?Programer')
查看全部 -
構造對象的過程:
首先調用__new__方法創(chuàng)建類的對象:def __new__(cls),通常不必定義(繼承父類,父類會創(chuàng)建類對象),返回一個類的初始對象
將返回的對象交給__init__,對屬性進行設置:def __init__(self)
class?Programer(object): ????def?__new__(cls,?*args,?**kwargs):?#改寫new方法 ????????print?'call?__new__?method' ????????print?args ????????return?super(Programer,?self).__new__(cls,?*args,?**kwargs) ????def?__init__(self,?name,?age): ????????print?'call?__init__?method' ????????self.name?=?name ????????self.age?=?age ???????? if?__name__?=?'__main__': ????programer?=?Programer('Albert',?25) ????print?programer.__dict__
查看全部 -
多態(tài)的要素:
繼承
方法重寫
class?Programer(object): ????hobby?=?'Play?Computer' ???? ????def?__init__(self,?name,?age,?weight): ????????self.name?=?name ????????self._age?=?age ????????self.__weight?=?weight ???????? ????def?self_introduction(self): ????????print?'My?name?is?%s?\nI?am?%s?years?old\n'?%?(self.name,?self._age) ???? class?BackendProgramer(Programer): ????def?__init__(self,?name,?age,?weight,?language): ????????super(BackendProgramer,?self).__init__(name,?age,?weight) ????????self.language?=?language???? ???? ????def?self_introduction(self): ????????print?'My?name?is?%s?\nMy?favorite?language?is?%s'?%?(self.name,?self.language) def?introduce(programer): ????if?isinstance(programer,?Programer): ????????programer.self_introduction() ??????????????????? if?__name__?==?'__main__': ????programer?=?Programer('Albert',?25,?80) ????backend_programer?=?BackendProgramer('Tim',?30,?70,?'Python') ????introduce(programer) ????introduce(backend_programer)
查看全部 -
繼承使得大量代碼被復用,是面向對象的優(yōu)勢。
Object類是一切類的父類。
繼承的子類會繼承父類的屬性和方法,也可以自己定義,覆蓋父類的屬性和方法。
在重寫父類時,需要調用父類里的方法-->super()
class?A(object): ????def?method(self,?arg): ????????pass class?B(A): ????def?method(self,?arg): ????????super(B,?self).method(arg)
子類的類型判斷:
isinstance:判斷類型
issubclass:判斷是否是子類
class?Programer(object): ????hobby?=?'Play?Computer' ????def?__init__(self,?name,?age,?weight): ????????self.name?=?name ????????self._age?=?age ????????self.__weight?=?weight ???????? ????def?self_introduction(self): ????????print?'My?name?is?%s?\nI?am?%s?years?old\n'?%?(self.name,?self._age) ???????? class?BackendProgramer(Programer): ????def?__init__(self,?name,?age,?weight,?language): ????????super(BackendProgramer,?self).__init__(name,?age,?weight) ????????self.language?=?language ???????? if?__name__?==?'__main__': ????programer?=?BackendProgramer('Albert',?25,?80,?'Python') ????print?dir(programer) ????print?programer.__dict__ ????print?type(programer)?#-->屬于BackendProgramer ????print?isinstance(programer,?Programer)?#-->True
查看全部 -
函數(shù)與方法的區(qū)別:
函數(shù):直接調用函數(shù)名的方式
方法:必須與對象結合使用,依附于類
類的方法可以看做類的屬性,也沒有訪問控制(與類的屬性一致)。
兩個裝飾器:
@classmethod,類似直接在類里定義屬性,調用時用類名,而不是某個對象
@property,原調用方法:對象名.方法名(),現(xiàn)調用方法:像訪問屬性一樣調用方法
class?Programer(object): ????hobby?=?'Play?Computer' ????def?__init__(self,?name,?age,?weight): ????????self.name?=?name ????????self._age?=?age ????????self.__weight?=?weight ???????? ????@classmethod ????def?get_hobby(cls): ????????return?cls.hobby ???????? ????@property ????def?get_weight(self): ????????return?self.__weight ???????? ????def?self_introduction(self): ????????print?'My?name?is?%s?\nI?am?%s?years?old\n'?%?(self.name,?self._age) ???????? if?__name__?==?'__main__': ????programer?=?Programer('Albert',?25,?80) ????print?dir(programer) ????print?Programer.get_hobby()?#用類名Programer調用 ????print?programer.get_weight?#像訪問屬性一樣,不用加括號 ????programer.self_introduction()
查看全部 -
定義類的屬性:
在類里定義,類里所有對象共享該屬性
在構造函數(shù)里定義,在構造對象時將屬性值傳入
沒有訪問控制(JAVA:Public&Private),沒有提供私有屬性的功能
class?Programer(object): ????hobby?=?'Play?Computer' ???? ????def?__init__(self,?name,?age,?weight): ????????self.name?=?name?#無下劃線-->可以公開訪問 ????????self._age?=?age?#有一個下劃線-->私有屬性,仍可訪問 ????????self.__weight?=?weight?#兩個下劃線-->部分私有屬性,需要改變屬性名訪問 ???????? ????def?get_weight(self):?#定義獲取weight屬性的方法 ????????return?self.__weight ???????? if?__name__?==?'__main__': ????programer?=?Programer('Albert',?25,?80)?#對象實例化 ????print?dir(programer) ????print?programer.__dict__?#從構造函數(shù)里獲得的屬性 ????print?programer.get_weight() ????print?programer._Programer__weight?#“對象名._類名__屬性名”的方法訪問
查看全部 -
定義類
class?ClassName: ????def?__init__(self,?[……)?#構造函數(shù):設置類的屬性 ????????pass ????def?__del__(self,?[……)?#析構函數(shù):銷毀對象時調用 ????????pass
舊式類:
class?OldStyle: ????pass
新式類:(在python2中,若一個類沒有繼承別的類,最好繼承object類;在python3中,所有類皆是新式類)
class?NewStyle(object): ????pass
類的內(nèi)建函數(shù):
dir():返回對象的屬性
type():獲取對象的類型
查看全部 -
面向對象的兩個基本概念:
類:定義了一件事物的抽象特點,例如現(xiàn)實生活中的某個群體
對象:類的實例,例如某個群體中的個體
面向對象的基本要素:
屬性(變量),例如某個群體的信息:年齡、性別、身高
方法(函數(shù)),例如某個群體的功能:寫代碼、修電腦
面向對象的特性:
封裝性:對外暴露了功能,隱藏了具體的實現(xiàn)細節(jié)
繼承:對龐大群體進行細微分類,子類繼承父類的屬性和方法,分為單繼承與多重繼承,例如前端程序員、后端程序員
多態(tài):由同一個類繼承的幾個類,在調用同一個方法時,會有不同的反應,例如同一類群體對同一件事有不同的看法
查看全部 -
比較運算符:
__cmp__(self,other)、__eq__(self,other) 、__lt__(self,other) 、__gt__(self,other)
數(shù)字運算符:
__add__(self,other) 、 __sub__(self,other)?? 、 __mul__(self,other)? 、? __div__(self,other)
邏輯運算符:
__or__(self,other) 、? __and__(self,other)
查看全部
舉報