內置類屬性
1.什么是內置類屬性
聲明類的時候系統(tǒng)自動添加的屬性(可能是字段鳍征,也可能是對象屬性)
1)name
類的字段篇梭;類名.name -- 獲取類的名字(字符串)
2)doc
類的字段蚂子;類名.doc -- 獲取類的說明文檔
3)class
對象屬性泛粹;對象.class -- 獲取對象對應的類
print(type(p1)) #type和它功能相似
print(p1.class)
4)dict (重要埃儿,對象轉換成字典,字典轉換成對象)
對象屬性宴胧;對象.dict -- 將對象中(init里)所有的屬性和對應的值轉換成一個字典中的鍵值對(一個對象一個字典)
類的字段漱抓;類.dict -- 將類轉換成一個字典,字典中的所有元素是類中所有的字段和對應的值
5)module
類的字段牺汤;類.module--獲取當前類是在哪個模塊中聲明的(返回值的是模塊的名字)
6)bases
類的字段辽旋;類名.bases - 獲取當前類的父類(返回的是一個元組)
私有化
1.訪問權限:公開浩嫌,保護檐迟,私有
1)公開 - 公開的屬性和方法是在類的內部,外部能夠使用也能繼承
2)保護 - 保護的屬性和方法在類的內部能夠使用码耐,外部不能使用可以被繼承
3)私有 - 私有的屬性和方法只能在類的內部使用追迟,外部不能使用,也不能被繼承
2.Python中屬性和方法的訪問權限
1)python類中所有的屬性和方法本質都是公開的骚腥;私有化只是'提示'程序員敦间,這個屬性或者方法在外部不要使用,也不要去繼承
2)怎么私有化(只能在內部用):在需要私有化的屬性名或者方法名前面加''(不能以''結尾)
3)私有化的原理:在私有的屬性和方法前加了‘_類名’就可以查詢私有化的屬性和方法。
屬性的getter和setter
1)getter -- 當我們需要在獲取屬性值之前做其他的事情廓块,就需要給這個屬性添加getter厢绝。
2)setter -- 當需要給屬性賦值之前做點別的事情,就需要給這個屬性添加setter带猴。
3)給屬性添加getter
a. 屬性命名的時候前面加'_'(一個下劃線)
b. 在@property裝飾器后面聲明一個對象方法:
將屬性去掉下劃線作為反方法名
方法除了self以外不需要其他參數(shù)
函數(shù)的返回值就是獲取這個屬性帶下劃線的值
4)給屬性添加setter
屬性添加setter之前必須先添加getter
a.保證添加屬性名前有一個下劃線‘_’
b.在@getter名.setter聲明對象方法
將屬性去掉下劃線作為方法名
需要一個self以外的參數(shù)
不需要返回值
c. 在外部使用屬性的時候昔汉,通過‘對象.不帶下劃線的屬性’去使用
注意:當給屬性賦值的時候,實質是在調用setter對應的方法
class WriteError(Exception):
def __str__(self):
return '不能修改只讀屬性'
class retangle:
def __init__(self, width, height):
if isinstance(height,int) or isinstance(float,int):
self._height = height
else:
raise ValueError
self._width = width
self._height = height
self._area = 0
self._perimeter = 0
@property
def width(self):
return self._width
@width.setter
def width(self,value):
if not isinstance(value, int) or isinstance(value, float):
raise ValueError
if value < 0:
raise ValueError
self._width = value
@property
def height(self):
return self.height
@height.setter
def height(self, value):
if not isinstance(value, int) or isinstance(value, float):
raise ValueError
if value < 0:
raise ValueError
self._height = value
@property
def area(self):
return self._width*self._height
@area.setter
def area(self):
raise WriteError
@property
def perimeter(self):
return (self._width+self._height)*2
p1 = retangle(2,4)
print(p1.area)
print(p1.perimeter)
p1.area = 20
print(p1.area) #應該報錯不能修改只讀屬性
類中的方法分為:對象方法拴清,類方法靶病,靜態(tài)方法
1)對象方法
a.怎么聲明:直接聲明
b.怎么調用:用對象來調用
c.特點:有指向當前對象的self
d.什么時候用:如果實現(xiàn)函數(shù)的功能需要用到對象屬性,就使用對象方法
2)類方法(類能做的事情口予,cls都能做)
a.怎么聲明:聲明在@classmethod的后面
b.怎么調用:用類來調用娄周,‘類.類方法()’
c.特點:有自帶的參數(shù)cls,表示當前類,這個參數(shù)在調用的時候不用傳參沪停,系統(tǒng)會自動將當前類傳給它煤辨。誰調用就指向誰(如果是對象指向的是對象對應的類)
d.什么時候用:如果實現(xiàn)函數(shù)的功能不需要對象屬性,但是需要類的字段木张,就使用類方法
3)靜態(tài)方法
a.怎么聲明:聲明在@staticmethod后面
b.怎么調用:通過類來調用掷酗,‘類.靜態(tài)方法()’
c.特點:沒有默認參數(shù)(參數(shù)需要時自定)
d.什么時候用:實現(xiàn)函數(shù)的功能既不需要類也不需要對象,就使用靜態(tài)方法
繼承
1.什么是繼承窟哺?
繼承 -- 就是讓子類直接擁有父類的屬性和方法
子類 - 繼承者
父類/超類 - 被繼承者
2.怎么繼承
1)語法
class 類名(父類1泻轰,父類2,且轨,):
說明文檔
類的內容
2)說明:
() - 固定寫法浮声。如果省略括號就默認繼承object(基類)
父類 - 一個類的父類可以有多個,但是一般情況下只有一個(支持多繼承)