內(nèi)置類屬性
什么是內(nèi)置類屬性
在聲明的時候系統(tǒng)自動添加的屬性(可能是字段也可能是對象屬性)
class Person:
num = 61
# 注意:如果設(shè)置了__slots__的值末融,那么當(dāng)前類的對象就不能使用__dict__屬性
def __init__(self, name, sex, age):
self.name = name
self.sex = sex
self.age = age
def eat(self, food):
print()
# 定制當(dāng)前類的對象
# 1)重寫__str__方法,這個方法的返回值就是對應(yīng)的打印結(jié)果(類型必須是字符串)
# def __str__(self):
# return '<' + str(self.__dict__)[1:-1] + '>'
# 重寫__repr__方法坐慰,這個方法的返回值就是對應(yīng)的打印結(jié)果(類型必須是字符串
def __repr__(self):
return '<' + str(self.__dict__)[1:-1] + '>'
person1 = Person('小米', '男', 18)
# 1.__name__
"""
類的字段:類名.__name__ - 獲取類的名字
"""
print('==============')
print(type(Person.__name__))
# 2.__doc___
"""
類的字段;類.__doc___ - 獲取聲明文檔
"""
# 3.__class__
"""
對象屬性:對象.__class__ - 獲取對象對應(yīng)的類(和type功能一樣)
"""
print('================')
p1 = person1.__class__('小米', '男', 17)
print(p1.age)
print(type(person1))
# 4.__dict__(將對象轉(zhuǎn)換成字典)
"""
對象屬性:對象.__dict__ - 將對象中所有的屬性和值轉(zhuǎn)換成對應(yīng)的一個字典中的鍵值對(一個對象對應(yīng)一個字典)
類的字段:類.__dict__ - 將類轉(zhuǎn)換成一個字典叛复,字典值的元素是類中所有的字段和對應(yīng)的值
"""
print(person1.__dict__)
print(Person.__dict__)
person = [person1]
print(person)
# 5.__module__
"""
類的字段:類.__module__ - 獲取聲明當(dāng)前類是在哪個模塊中聲明的(返回的是模塊的名字)
"""
# 6.__bases__
"""
類的字段:類.__bases__ - 獲取當(dāng)前類的父類(返回的是一個元組)
"""
私有化
- 1.訪問權(quán)限:公有疆偿、保護(hù)芝薇、私有
????公有 - 公有的屬性和方法在類的內(nèi)部劫拢、外部能夠使用肉津,也能被繼承
????保護(hù) - 保護(hù)的屬性和方法只能在類的內(nèi)部使用,可以被繼承
????私有 - 私有的屬性和方法只能在類的內(nèi)部使用舱沧,不能被繼承 - 2.python中的屬性和方法的訪問權(quán)限
????python類中所有的屬性和方法本質(zhì)都是公開的妹沙;私有化是假的,只是提示程序員這個屬性和方法在外部不要使用熟吏,也不要去繼承
????怎么私有化:在需要私有化的屬性名和方法前加'__'(注意不能以'__'結(jié)尾)
python私有化的原理:在私有的屬性和方法前加了'_類名'
屬性的getter和setter
- 1.什么是getter和setter
??當(dāng)我們需要在獲取屬性值之前做點(diǎn)別的事情初烘,就需要給這個屬性添加getter
??當(dāng)我們需要給屬性賦值之前做點(diǎn)別的事情,就需要給這個屬性添加getter - 2.給屬性添加getter
??1)屬性命名的時候前面加'_'
??2)在@property裝飾器后面聲明一個對象方法
????a.將屬性去掉下劃線作為方法名
????b.方法除了self以外不需要其他參數(shù)
????c.函數(shù)的返回值就是獲取這個屬性的時候得到的值
??3)在外部使用屬性的時候,通過'對象.不帶下劃線'去使用
??注意:獲取屬性值的時候分俯,就會自動去調(diào)用getter函數(shù)
3.給屬性添加setter
??屬性添加setter之前必須先添加getter
??1)保證屬性名前'_'
??2)在@getter名.setter后面聲明對象方法
????a.將屬性去掉下劃線作為方法名
????b.需要一個self以外的參數(shù)
????c.不需要返回值
??3)在外部使用屬性的時候,通過'對象.不帶下劃線'去使用
??注意:當(dāng)給屬性賦值的時候哆料,實(shí)質(zhì)是調(diào)用setter對應(yīng)的方法
# 練習(xí):寫一個矩形類缸剪,有長,寬东亦,面積杏节,周長
class Rectangle:
def __init__(self, length, weight):
self._length = length
self._weight = weight
self._area = None
self._perimeter = None
@property
def length(self):
return self._length
@length.setter
def length(self, value):
if (isinstance(value, int) or isinstance(value, float)) and value > 0:
self._length = value
else:
raise ValueError
@property
def weight(self):
return self._weight
@weight.setter
def weight(self, value):
if (isinstance(value, int) or isinstance(value, float)) and value > 0:
self._weight = value
else:
raise ValueError
@property
def area(self):
self._area = self._weight * self._length
return self._area
@area.setter
def area(self, value):
raise ValueError
@property
def perimeter(self):
self._perimeter = (self._weight + self._length) * 2
return self._perimeter
@perimeter.setter
def perimeter(self, value):
raise ValueError
r1 = Rectangle(100, 200)
print(r1.area)
print(r1.perimeter)
r1.length = 20
r1.weight = 30
print(r1.area)
print(r1.perimeter)
方法
1.對象方法
??1)怎么聲明:直接聲明
??2)怎么調(diào)用:用對象來調(diào)用
??3)特點(diǎn):有指向當(dāng)前對象的self
??4)什么時候用:如果實(shí)現(xiàn)函數(shù)的功能需要用到對象屬性,就是用對象方法2.類方法
??1)怎么聲明:聲明在@classmethod
??2)怎么調(diào)用:用類來調(diào)用
??3)特點(diǎn):有自帶的參數(shù)cls典阵,表示當(dāng)前類奋渔;這個參數(shù)在調(diào)用的時候不傳參,系統(tǒng)會將當(dāng)前類傳給它
??????cls:誰調(diào)用就指向誰(如果是對象壮啊,指向的是對象對應(yīng)的類)
??4)什么時候用:如果實(shí)現(xiàn)函數(shù)的功能不需要對象屬性嫉鲸,但需要類的字段,就是用類方法3.靜態(tài)方法
??1)怎么聲明:聲明在staticmethod后面
??2)怎么調(diào)用:通過類來調(diào)用歹啼,'類.靜態(tài)方法()'
??3)特點(diǎn):沒有默認(rèn)參數(shù)
??4)什么時候用:實(shí)現(xiàn)函數(shù)的功能既不需要類也不需要對象玄渗,就是使用靜態(tài)方法
繼承
- 1.什么是繼承
??繼承就是讓子類直接擁有父類的屬性和方法
??子類 - 繼承者
??父類/超類 - 被繼承者 - 2.怎么繼承
1)語法
??class 類名(父類1座菠,父類2....):
????說明文檔
????類的內(nèi)容
2)說明
??() - 固定寫法,如果省略相當(dāng)于(object)聲明類的時候如果沒有寫父類藤树,默認(rèn)繼承object(object又叫基類)
??父類 - 一個類的父類可以有多個浴滴,但是一般情況下只有一個(支持多繼承)
??注意:在子類中可以加super()去調(diào)用父類的方法(只能在對象方法和類方法中使用)在子類中添加對象屬性,需要通過super()去調(diào)用父類的init方法