class Human:
"""
說明文檔
類型:人類
"""
num = 61
def __init__(self, name, gender, age):
self.name = name
self.gender = gender
self.age = age
def eat(self, food):
print("%s在吃%s" % (self.name, food))
p1 = Human("小明", "man", 19)
print(type(Human)) # <class 'type'>
print(Human.name) # Human
1.name
"""
類的字段,類的名字:類名稱.name
"""
2.doc
"""獲取類的說明文檔"""
print(Human.doc)
說明文檔
類型:人類
3.class
"""對(duì)象屬性:對(duì)象.class 獲取對(duì)象對(duì)應(yīng)的類豹芯,返回的是類,相當(dāng)于type(對(duì)象)"""
print(p1.class) # <class 'main.Human'>
print(type(p1)) # <class 'main.Human'>
4.dict
"""對(duì)象屬性冯凹,對(duì)象.dict,將對(duì)象中所有的屬性轉(zhuǎn)化為字典
類的字段圾另,柳譬;類.dict,將類轉(zhuǎn)換成字典干签,字典中的元素是類中所有的字段和對(duì)應(yīng)的值
"""
print(p1.dict)
print(Human.dict)
5類的答應(yīng)的定制
"""
1.重寫str方法:返回值就是對(duì)應(yīng)的打印結(jié)果
2.重寫repr方法碗旅,返回值就是對(duì)應(yīng)的打印結(jié)果
"""
def str(self):
return "<" + str(self.dict)[1:-1] + ">"
6 將字典轉(zhuǎn)換為對(duì)象
class Person:
def init(self, dict1: dict):
for key in dict1:
setattr(self, key, dict1[key])
7 module
"""獲取當(dāng)前類是在哪個(gè)模塊中聲明的贷揽,返回的是模塊的名字"""
print(p1.module)
8 bases
"""類的字段棠笑;類.bases:獲取當(dāng)前類的父類,返回的是一個(gè)元組"""
8私有化
"""
訪問權(quán)限:公開禽绪,保護(hù)蓖救,私有
公開:公開的屬性和方法在類的內(nèi)部,外部以及子類使用印屁,也能被繼承循捺;
保護(hù):保護(hù)的屬性和方法在類的內(nèi)部能夠使用,在外部不能被使用雄人,但是可以被繼承从橘;
私有:私有屬性和方法只能在類的內(nèi)部使用,外部不能使用础钠,也不可以被繼承恰力。
python中的所有屬性和方法本質(zhì)都是公開的,私有化是假的私有化旗吁,只是提示這個(gè)屬性或者方法在外部不能使用踩萎,也不要繼承。
私有化的方法:在需要私有化的屬性名或者方法名前加“”(不能以“”結(jié)尾)
python私有化的原理:在私有屬性和方法前加了“_類名”
"""
9 屬性的gettr 和 settr的用法
"""
當(dāng)我們需要在獲取屬性值之前做點(diǎn)別的事情很钓,就需要給屬性添加getter香府;
當(dāng)我們需要給屬性賦值之前做點(diǎn)別的事情董栽,就需要給屬性添加setter;
"""
class Human:
def init(self, name, gender, age):
self.name = name
self.gender = gender
self.age = age # 帶的屬性
@property
def age(self):
if self._age < 18:
return "青年"
@age.setter
def age(self, value):
self.age = value
p1 = Human("小明", "男", 17)
print(p1.age)
print(p1.age, 200)
給屬性添加getter:
1.給需要加getter的屬性下添加_企孩;
2.在@property裝飾器后聲明一個(gè)對(duì)象方法锭碳,要求方法名為屬性去掉下劃線,函數(shù)除了self之后不需要其他參數(shù)柠硕,函數(shù)的返回值就是獲取這個(gè)屬性的時(shí)候得到的值工禾;
3.在外部使用屬性的時(shí)候运提,通過“對(duì)象.不帶下劃線”的形式去使用蝗柔。
給屬性添加setter:屬性添加setter之前必須先添加getter
1.保證屬性名前有_;
2.需要一個(gè)self以外的參數(shù),不需要返回值
3.在外部使用屬性的時(shí)候民泵,通過“對(duì)象.下劃線使用”
本質(zhì):當(dāng)給屬性賦值的時(shí)候癣丧,實(shí)質(zhì)是調(diào)用setter對(duì)應(yīng)方法。
class Rectangle:
def init(self, width, long):
self._width = width
self._long = long
self.area = width * long
self.perimeter = 2 * (long + width)
@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 long(self):
return self._long
@long.setter
def long(self, value):
if not isinstance(value, int) or isinstance(value, float):
raise ValueError
if value < 0:
raise ValueError
self._long = value
rect = Rectangle(12, 34)
print(rect.width, rect._long, rect.area, rect.perimeter)
9 類方法
"""
對(duì)象方法:
a.聲明:直接聲明
b.用對(duì)象調(diào)用
c.有指向當(dāng)前對(duì)象的self
d.什么時(shí)候用:如果實(shí)現(xiàn)函數(shù)的功能需要用到對(duì)象屬性栈妆,就使用對(duì)象方法
類方法:
a.聲明:聲明在@classmethod后
b.用類來(lái)調(diào)用
c.有指向當(dāng)前類的參數(shù)cls胁编,調(diào)用的時(shí)候不用傳參,系統(tǒng)會(huì)自動(dòng)將當(dāng)前類傳給他鳞尔。誰(shuí)調(diào)用就指向誰(shuí)嬉橙。如果是對(duì)象就指向?qū)ο蟮念悺?br>
d.什么時(shí)候用:實(shí)現(xiàn)函數(shù)的功能不需要對(duì)象屬性,但是需要類的字段
靜態(tài)方法:
a.聲明:聲明在@staticmethod后
b.用類來(lái)調(diào)用
c.類中的普通方法寥假,沒有默認(rèn)參數(shù)
d.什么時(shí)候用:實(shí)現(xiàn)函數(shù)功能既不需要類也不需要對(duì)象市框,就使用靜態(tài)方法
"""
class Person1:
def init(self, name, gender, age):
self.name = name
self.gender = gender
self.age = age
def eat(self):
print("吃")
@classmethod
def func1(cls):
print("這是一個(gè)類方法")
@staticmethod
def func2():
print("jsodfhkds")
print(Person1.func1())
print(Person1.func2())
10 繼承
"""
繼承:讓子類直接擁有父類的屬性和方法
子類:繼承者
父類、超類:被繼承者
1.語(yǔ)法:
class 類名(父類1糕韧,父類2...):
說明文檔
類的內(nèi)容
2.說明:
()枫振,如果中間省略相當(dāng)于繼承自基類(object類)
父類:一個(gè)類的父類可以有多個(gè),一個(gè)父類的子類也可以有多個(gè)萤彩,但是一般情況下只要一個(gè)粪滤。
在子類中可以用super().父類方法,調(diào)用父類中的方法只能在對(duì)象方法和類方法中應(yīng)用,靜態(tài)方法不適用;
在子類中添加對(duì)象屬性雀扶,需要先通過super()去調(diào)用父類的init()方法來(lái)繼承父類的屬性杖小。
"""