01類(lèi)和對(duì)象
1痢缎、理論上的定義
類(lèi):就是擁有相同功能和相同屬性的對(duì)象的集合(類(lèi)是抽象的)
對(duì)象:類(lèi)的實(shí)例(對(duì)象是具體的)
2辉饱、編程思想
面向過(guò)程編程:以算法為工具
函數(shù)式編程:以函數(shù)為工具
面向?qū)ο缶幊蹋阂灶?lèi)和對(duì)象為工具
02類(lèi)的聲明
1纳决、類(lèi):對(duì)擁有相同功能(方法)和相同屬性(屬性)的封裝
封裝效果:一個(gè)類(lèi)中可以對(duì)多個(gè)功能進(jìn)行封裝(多個(gè)函數(shù))捞奕。封裝多個(gè)屬性
2茄袖、類(lèi)的聲明格式
class 類(lèi)名(父類(lèi)列表):
類(lèi)的說(shuō)明文檔
類(lèi)的內(nèi)容
3、說(shuō)明:
class :聲明類(lèi)的關(guān)鍵字
類(lèi)名:標(biāo)識(shí)符详瑞,不能是關(guān)鍵字。駝峰式命名(第一個(gè)單詞首字母小寫(xiě)冬阳,其他單詞首字母大寫(xiě))蛤虐,
(父類(lèi)列表):這個(gè)部分可以省。這個(gè)是繼承語(yǔ)法肝陪,可以多繼承驳庭。
冒號(hào):固定的
類(lèi)的內(nèi)容:包括類(lèi)的方法和類(lèi)的屬性
4、類(lèi)中的方法
方法:就是聲明在類(lèi)中的函數(shù)
a.對(duì)象方法:對(duì)象方法需要通過(guò)對(duì)象來(lái)調(diào)用氯窍,對(duì)象.函數(shù)名()
b.類(lèi)方法:直接寫(xiě)在類(lèi)中的方法饲常,自帶一個(gè)self參數(shù)。
c.靜態(tài)方法
5.創(chuàng)建對(duì)象
創(chuàng)建類(lèi)的時(shí)候狼讨,系統(tǒng)會(huì)默認(rèn)給我們創(chuàng)建這個(gè)類(lèi)對(duì)應(yīng)的構(gòu)造方法贝淤。
構(gòu)造方法:類(lèi)名() ---> 創(chuàng)建類(lèi)對(duì)應(yīng)的對(duì)象。
例子:
# 創(chuàng)建一個(gè)類(lèi)
class Person:
"""
人類(lèi):
"""
def eat(self):
print('人吃飯')
if __name__ == '__main__':
# 1政供、創(chuàng)建對(duì)象
p1 = Person() #創(chuàng)建Person類(lèi)的對(duì)象播聪,并且將對(duì)象的地址存到地址p1中。
# 一個(gè)類(lèi)可以有多個(gè)對(duì)象
p2 = Person()
print(id(p1),id(p2))
# 2布隔、調(diào)用對(duì)象方法
# 通過(guò)對(duì)象調(diào)用對(duì)象方法离陶,默認(rèn)參數(shù)self不需要傳參。系統(tǒng)會(huì)自動(dòng)傳衅檀。
p1.eat()
03-構(gòu)造方法和init方法
1招刨、構(gòu)造方法:系統(tǒng)自動(dòng)創(chuàng)建的,方法名和類(lèi)名一樣哀军。用來(lái)創(chuàng)建對(duì)象沉眶。
2、init:init方法的功能是用來(lái)做初始化和添加對(duì)象屬性的
當(dāng)我們通過(guò)構(gòu)造方法去創(chuàng)建對(duì)象的時(shí)候杉适,系統(tǒng)會(huì)自動(dòng)調(diào)用init方法谎倔。
class Dog:
def __init__(self):
print('init方法')
class Person:
# init方法可以添加參數(shù)
def __init__(self, name):
print(name)
print('人類(lèi)的init方法')
if __name__ == '__main__':
# 創(chuàng)建對(duì)象的過(guò)程:調(diào)用構(gòu)造方法在內(nèi)存中開(kāi)辟空間創(chuàng)建一個(gè)對(duì)象,然后用新建的這個(gè)對(duì)象去調(diào)用init方法猿推,
# 來(lái)初始化對(duì)象的屬性传藏,最后才將對(duì)象返回。
dog1 = Dog()
dog2 = Dog()
# 如果類(lèi)的init方法有參數(shù),通過(guò)給構(gòu)造方法傳參類(lèi)init方法傳參毯侦。
p1 = Person('小明')
04-對(duì)象的屬性
1哭靖、類(lèi)中的內(nèi)容:屬性和方法
屬性:
a.對(duì)象的屬性:不同的對(duì)象,對(duì)應(yīng)的值可能不一樣侈离,這樣的屬性是對(duì)象屬性试幽。屬于對(duì)象
類(lèi)中的對(duì)象屬性是聲明在init方法中的,并且聲明格式是:self.屬性名 = 初值卦碾;
對(duì)象屬性的使用:對(duì)象.屬性名
b.類(lèi)的字段:屬于類(lèi)的铺坞,所有的對(duì)象對(duì)應(yīng)的值是一樣的
方法:
a.對(duì)象方法
b.類(lèi)方法
c.靜態(tài)方法
2、python是動(dòng)態(tài)語(yǔ)言洲胖,python中類(lèi)的對(duì)象的屬性可以進(jìn)行增刪的操作
1)济榨、 查(獲取屬性的值)
方法一:對(duì)象.屬性名
方法二:getattr(object(對(duì)象), name(屬性名), default=None)
方法三:對(duì)象.__getattribute__(屬性名)
2、改(修改屬性的值)
方法一:對(duì)象.屬性 = 新值
方法二:setattr(p1, 'age', 20)
方法三:對(duì)象.__setattr__(屬性名绿映,新值)
3擒滑、增(添加屬性 ---- 屬性不存在)
方法一:對(duì)象.屬性 = 新值
方法二:def setattr(對(duì)象,屬性名叉弦,新值)
方法三:對(duì)象.__setattr__(屬性名丐一,新值)
4、刪(刪除對(duì)象屬性)
方法一:del 對(duì)象.屬性
方法二:delattr(對(duì)象淹冰,屬性名)
方法三:對(duì)象.__delattr__()
05-對(duì)象方法
對(duì)象方法:
a库车、直接聲明在類(lèi)中的函數(shù)默認(rèn)是對(duì)象方法,有一個(gè)默認(rèn)參數(shù)self樱拴。
b柠衍、對(duì)象方法要通過(guò)對(duì)象來(lái)調(diào)用:對(duì)象.對(duì)象方法()
c、對(duì)象方法中默認(rèn)參數(shù)self晶乔,不需要傳參珍坊。因?yàn)樵谡{(diào)用這個(gè)方法的時(shí)候系統(tǒng)會(huì)自動(dòng)將當(dāng)前對(duì)象傳給self。
哪個(gè)對(duì)象調(diào)用的方法瘪弓,self就指向誰(shuí)。
練習(xí)1禽最、寫(xiě)一個(gè)矩形類(lèi)腺怯,有長(zhǎng)和寬,有兩個(gè)功能川无,分別是求周長(zhǎng)和面積呛占。
class Rect:
def __init__(self, width, high):
self.width = width
self.high = high
def C(self):
return 2*(self.width+self.high)
def Area(self):
return self.high*self.width
rect1 = Rect(2,3)
print('該矩形的周長(zhǎng)是%d,面積是%d'%(rect1.C(),rect1.Area()))
練習(xí)2、寫(xiě)一個(gè)班級(jí)類(lèi)懦趋,班級(jí)里面有多個(gè)學(xué)生的成績(jī)(一門(mén)),班級(jí)名晾虑,可以獲取成績(jī)的最高分
class Class:
def __init__(self, class_name, score):
self.class_name = class_name
self.score = score
def get_max(self):
if not self.score:
return 0
return max(self.score)
class1 = Class('1班', [35,56,67,78,89,90,43])
print('%s里的最高分是%d'%(class1.class_name,class1.get_max()))
06-類(lèi)的字段與方法
1、類(lèi)的屬性叫類(lèi)的字段
a.什么是類(lèi)的字段
類(lèi)的字段就是聲明在類(lèi)的里面,方法的外面的變量帜篇,
b.什么樣的屬性聲明成類(lèi)的字段:
屬于類(lèi)的糙捺,對(duì)于這個(gè)類(lèi)的所有的對(duì)象來(lái)說(shuō),其值是公有的
c.怎么使用:
通過(guò)類(lèi)來(lái)使用:類(lèi).字段
2笙隙、類(lèi)中的方法
1).對(duì)象方法(實(shí)例方法)
聲明的形式:直接聲明在類(lèi)型洪灯。
特點(diǎn):自帶一個(gè)不需要主動(dòng)傳參的默認(rèn)參數(shù)self,誰(shuí)來(lái)調(diào)用指向誰(shuí)竟痰。
調(diào)用:通過(guò)對(duì)象來(lái)調(diào)用签钩。
2).類(lèi)方法
聲明的形式:聲明方法前需要使用@classmethod說(shuō)明
特點(diǎn):自帶一個(gè)默認(rèn)參數(shù)cls,這個(gè)參數(shù)調(diào)用的時(shí)候不需要傳值。系統(tǒng)自動(dòng)給他傳坏快。誰(shuí)調(diào)用就指向誰(shuí)铅檩。始終指向當(dāng)前類(lèi)。
調(diào)用:通過(guò)類(lèi)來(lái)調(diào)用 --- 類(lèi).類(lèi)方法()
3).靜態(tài)方法:
聲明形式:聲明方法前需要使用@staticmethod說(shuō)明
特點(diǎn):沒(méi)有默認(rèn)的參數(shù)
調(diào)用:通過(guò)類(lèi)來(lái)調(diào)用---類(lèi).靜態(tài)方法()
@staticmethod
4).遇到問(wèn)題怎么來(lái)選擇使用哪種方法:
a莽鸿、大前提:只要實(shí)現(xiàn)方法的功能需要用到對(duì)象的屬性昧旨,我們就使用對(duì)象方法。否則就使用靜態(tài)方法或者類(lèi)方法富拗。
b臼予、不使用對(duì)象方法的前提下,如果實(shí)現(xiàn)功能需要用到類(lèi)的字段就使用類(lèi)方法啃沪。
c粘拾、實(shí)現(xiàn)功能既不需要對(duì)象的屬性,又不需要類(lèi)的字段就使用靜態(tài)方法创千。
注意:靜態(tài)方法和類(lèi)方法劃分不用那么嚴(yán)格缰雇,靜態(tài)方法能做的類(lèi)方法可以做,反之亦然追驴。
實(shí)例:
class Person:
def object_faunc(self):
print('對(duì)象方法')
# 聲明一個(gè)類(lèi)方法
@classmethod
def class_func(cls):
print('這是一個(gè)類(lèi)方法')
@staticmethod
def static_func():
print('這是一個(gè)靜態(tài)方法')
class Person:
# 類(lèi)的字段械哟,存儲(chǔ)人類(lèi)的數(shù)量
number = 61
@classmethod
def show_number(cls):
print('人類(lèi)的數(shù)量是%d億'% (cls.number))
@staticmethod
def sho_numbers():
print('人類(lèi)的數(shù)量是%d億' % (Person.number))
Person.show_number()
Person.sho_numbers()