內(nèi)置類屬性
什么是內(nèi)置類屬性
在聲明的時(shí)候系統(tǒng)自動(dòng)添加的屬性(可能是字段也可能是對(duì)象屬性)
class Person:
num = 61
# 注意:如果設(shè)置了__slots__的值,那么當(dāng)前類的對(duì)象就不能使用__dict__屬性
def __init__(self, name, sex, age):
self.name = name
self.sex = sex
self.age = age
def eat(self, food):
print()
# 定制當(dāng)前類的對(duì)象
# 1)重寫__str__方法,這個(gè)方法的返回值就是對(duì)應(yīng)的打印結(jié)果(類型必須是字符串)
# def __str__(self):
# return '<' + str(self.__dict__)[1:-1] + '>'
# 重寫__repr__方法,這個(gè)方法的返回值就是對(duì)應(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__
"""
對(duì)象屬性:對(duì)象.__class__ - 獲取對(duì)象對(duì)應(yīng)的類(和type功能一樣)
"""
print('================')
p1 = person1.__class__('小米', '男', 17)
print(p1.age)
print(type(person1))
# 4.__dict__(將對(duì)象轉(zhuǎn)換成字典)
"""
對(duì)象屬性:對(duì)象.__dict__ - 將對(duì)象中所有的屬性和值轉(zhuǎn)換成對(duì)應(yīng)的一個(gè)字典中的鍵值對(duì)(一個(gè)對(duì)象對(duì)應(yīng)一個(gè)字典)
類的字段:類.__dict__ - 將類轉(zhuǎn)換成一個(gè)字典,字典值的元素是類中所有的字段和對(duì)應(yīng)的值
"""
print(person1.__dict__)
print(Person.__dict__)
person = [person1]
print(person)
# 5.__module__
"""
類的字段:類.__module__ - 獲取聲明當(dāng)前類是在哪個(gè)模塊中聲明的(返回的是模塊的名字)
"""
# 6.__bases__
"""
類的字段:類.__bases__ - 獲取當(dāng)前類的父類(返回的是一個(gè)元組)
"""
私有化
- 1.訪問權(quán)限:公有、保護(hù)、私有
????公有 - 公有的屬性和方法在類的內(nèi)部、外部能夠使用,也能被繼承
????保護(hù) - 保護(hù)的屬性和方法只能在類的內(nèi)部使用,可以被繼承
????私有 - 私有的屬性和方法只能在類的內(nèi)部使用,不能被繼承 - 2.python中的屬性和方法的訪問權(quán)限
????python類中所有的屬性和方法本質(zhì)都是公開的;私有化是假的,只是提示程序員這個(gè)屬性和方法在外部不要使用,也不要去繼承
????怎么私有化:在需要私有化的屬性名和方法前加'__'(注意不能以'__'結(jié)尾)
python私有化的原理:在私有的屬性和方法前加了'_類名'
屬性的getter和setter
- 1.什么是getter和setter
??當(dāng)我們需要在獲取屬性值之前做點(diǎn)別的事情,就需要給這個(gè)屬性添加getter
??當(dāng)我們需要給屬性賦值之前做點(diǎn)別的事情,就需要給這個(gè)屬性添加getter - 2.給屬性添加getter
??1)屬性命名的時(shí)候前面加'_'
??2)在@property裝飾器后面聲明一個(gè)對(duì)象方法
????a.將屬性去掉下劃線作為方法名
????b.方法除了self以外不需要其他參數(shù)
????c.函數(shù)的返回值就是獲取這個(gè)屬性的時(shí)候得到的值
??3)在外部使用屬性的時(shí)候,通過'對(duì)象.不帶下劃線'去使用
??注意:獲取屬性值的時(shí)候,就會(huì)自動(dòng)去調(diào)用getter函數(shù)
3.給屬性添加setter
??屬性添加setter之前必須先添加getter
??1)保證屬性名前'_'
??2)在@getter名.setter后面聲明對(duì)象方法
????a.將屬性去掉下劃線作為方法名
????b.需要一個(gè)self以外的參數(shù)
????c.不需要返回值
??3)在外部使用屬性的時(shí)候,通過'對(duì)象.不帶下劃線'去使用
??注意:當(dāng)給屬性賦值的時(shí)候,實(shí)質(zhì)是調(diào)用setter對(duì)應(yīng)的方法
# 練習(xí):寫一個(gè)矩形類,有長(zhǎng),寬,面積,周長(zhǎng)
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.對(duì)象方法
??1)怎么聲明:直接聲明
??2)怎么調(diào)用:用對(duì)象來調(diào)用
??3)特點(diǎn):有指向當(dāng)前對(duì)象的self
??4)什么時(shí)候用:如果實(shí)現(xiàn)函數(shù)的功能需要用到對(duì)象屬性,就是用對(duì)象方法2.類方法
??1)怎么聲明:聲明在@classmethod
??2)怎么調(diào)用:用類來調(diào)用
??3)特點(diǎn):有自帶的參數(shù)cls,表示當(dāng)前類;這個(gè)參數(shù)在調(diào)用的時(shí)候不傳參,系統(tǒng)會(huì)將當(dāng)前類傳給它
??????cls:誰(shuí)調(diào)用就指向誰(shuí)(如果是對(duì)象,指向的是對(duì)象對(duì)應(yīng)的類)
??4)什么時(shí)候用:如果實(shí)現(xiàn)函數(shù)的功能不需要對(duì)象屬性,但需要類的字段,就是用類方法3.靜態(tài)方法
??1)怎么聲明:聲明在staticmethod后面
??2)怎么調(diào)用:通過類來調(diào)用,'類.靜態(tài)方法()'
??3)特點(diǎn):沒有默認(rèn)參數(shù)
??4)什么時(shí)候用:實(shí)現(xiàn)函數(shù)的功能既不需要類也不需要對(duì)象,就是使用靜態(tài)方法
繼承
- 1.什么是繼承
??繼承就是讓子類直接擁有父類的屬性和方法
??子類 - 繼承者
??父類/超類 - 被繼承者 - 2.怎么繼承
1)語(yǔ)法
??class 類名(父類1,父類2....):
????說明文檔
????類的內(nèi)容
2)說明
??() - 固定寫法,如果省略相當(dāng)于(object)聲明類的時(shí)候如果沒有寫父類,默認(rèn)繼承object(object又叫基類)
??父類 - 一個(gè)類的父類可以有多個(gè),但是一般情況下只有一個(gè)(支持多繼承)
??注意:在子類中可以加super()去調(diào)用父類的方法(只能在對(duì)象方法和類方法中使用)在子類中添加對(duì)象屬性,需要通過super()去調(diào)用父類的init方法