01類和對(duì)象
1、理論上的定義
類:就是擁有相同功能和相同屬性的對(duì)象的集合(類是抽象的)
對(duì)象:類的實(shí)例(對(duì)象是具體的)
2、編程思想
面向過程編程:以算法為工具
函數(shù)式編程:以函數(shù)為工具
面向?qū)ο缶幊蹋阂灶惡蛯?duì)象為工具
02類的聲明
1、類:對(duì)擁有相同功能(方法)和相同屬性(屬性)的封裝
封裝效果:一個(gè)類中可以對(duì)多個(gè)功能進(jìn)行封裝(多個(gè)函數(shù))。封裝多個(gè)屬性
2、類的聲明格式
class 類名(父類列表):
類的說明文檔
類的內(nèi)容
3、說明:
class :聲明類的關(guān)鍵字
類名:標(biāo)識(shí)符,不能是關(guān)鍵字。駝峰式命名(第一個(gè)單詞首字母小寫,其他單詞首字母大寫),
(父類列表):這個(gè)部分可以省。這個(gè)是繼承語法,可以多繼承。
冒號(hào):固定的
類的內(nèi)容:包括類的方法和類的屬性
4、類中的方法
方法:就是聲明在類中的函數(shù)
a.對(duì)象方法:對(duì)象方法需要通過對(duì)象來調(diào)用,對(duì)象.函數(shù)名()
b.類方法:直接寫在類中的方法,自帶一個(gè)self參數(shù)。
c.靜態(tài)方法
5.創(chuàng)建對(duì)象
創(chuàng)建類的時(shí)候,系統(tǒng)會(huì)默認(rèn)給我們創(chuàng)建這個(gè)類對(duì)應(yīng)的構(gòu)造方法。
構(gòu)造方法:類名() ---> 創(chuàng)建類對(duì)應(yīng)的對(duì)象。
例子:
# 創(chuàng)建一個(gè)類
class Person:
"""
人類:
"""
def eat(self):
print('人吃飯')
if __name__ == '__main__':
# 1、創(chuàng)建對(duì)象
p1 = Person() #創(chuàng)建Person類的對(duì)象,并且將對(duì)象的地址存到地址p1中。
# 一個(gè)類可以有多個(gè)對(duì)象
p2 = Person()
print(id(p1),id(p2))
# 2、調(diào)用對(duì)象方法
# 通過對(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)建的,方法名和類名一樣。用來創(chuàng)建對(duì)象。
2、init:init方法的功能是用來做初始化和添加對(duì)象屬性的
當(dāng)我們通過構(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('人類的init方法')
if __name__ == '__main__':
# 創(chuàng)建對(duì)象的過程:調(diào)用構(gòu)造方法在內(nèi)存中開辟空間創(chuàng)建一個(gè)對(duì)象,然后用新建的這個(gè)對(duì)象去調(diào)用init方法,
# 來初始化對(duì)象的屬性,最后才將對(duì)象返回。
dog1 = Dog()
dog2 = Dog()
# 如果類的init方法有參數(shù),通過給構(gòu)造方法傳參類init方法傳參。
p1 = Person('小明')
04-對(duì)象的屬性
1、類中的內(nèi)容:屬性和方法
屬性:
a.對(duì)象的屬性:不同的對(duì)象,對(duì)應(yīng)的值可能不一樣,這樣的屬性是對(duì)象屬性。屬于對(duì)象
類中的對(duì)象屬性是聲明在init方法中的,并且聲明格式是:self.屬性名 = 初值;
對(duì)象屬性的使用:對(duì)象.屬性名
b.類的字段:屬于類的,所有的對(duì)象對(duì)應(yīng)的值是一樣的
方法:
a.對(duì)象方法
b.類方法
c.靜態(tài)方法
2、python是動(dòng)態(tài)語言,python中類的對(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、直接聲明在類中的函數(shù)默認(rèn)是對(duì)象方法,有一個(gè)默認(rèn)參數(shù)self。
b、對(duì)象方法要通過對(duì)象來調(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就指向誰。
練習(xí)1、寫一個(gè)矩形類,有長和寬,有兩個(gè)功能,分別是求周長和面積。
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('該矩形的周長是%d,面積是%d'%(rect1.C(),rect1.Area()))
練習(xí)2、寫一個(gè)班級(jí)類,班級(jí)里面有多個(gè)學(xué)生的成績(一門),班級(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-類的字段與方法
1、類的屬性叫類的字段
a.什么是類的字段
類的字段就是聲明在類的里面,方法的外面的變量,
b.什么樣的屬性聲明成類的字段:
屬于類的,對(duì)于這個(gè)類的所有的對(duì)象來說,其值是公有的
c.怎么使用:
通過類來使用:類.字段
2、類中的方法
1).對(duì)象方法(實(shí)例方法)
聲明的形式:直接聲明在類型。
特點(diǎn):自帶一個(gè)不需要主動(dòng)傳參的默認(rèn)參數(shù)self,誰來調(diào)用指向誰。
調(diào)用:通過對(duì)象來調(diào)用。
2).類方法
聲明的形式:聲明方法前需要使用@classmethod說明
特點(diǎn):自帶一個(gè)默認(rèn)參數(shù)cls,這個(gè)參數(shù)調(diào)用的時(shí)候不需要傳值。系統(tǒng)自動(dòng)給他傳。誰調(diào)用就指向誰。始終指向當(dāng)前類。
調(diào)用:通過類來調(diào)用 --- 類.類方法()
3).靜態(tài)方法:
聲明形式:聲明方法前需要使用@staticmethod說明
特點(diǎn):沒有默認(rèn)的參數(shù)
調(diào)用:通過類來調(diào)用---類.靜態(tài)方法()
@staticmethod
4).遇到問題怎么來選擇使用哪種方法:
a、大前提:只要實(shí)現(xiàn)方法的功能需要用到對(duì)象的屬性,我們就使用對(duì)象方法。否則就使用靜態(tài)方法或者類方法。
b、不使用對(duì)象方法的前提下,如果實(shí)現(xiàn)功能需要用到類的字段就使用類方法。
c、實(shí)現(xiàn)功能既不需要對(duì)象的屬性,又不需要類的字段就使用靜態(tài)方法。
注意:靜態(tài)方法和類方法劃分不用那么嚴(yán)格,靜態(tài)方法能做的類方法可以做,反之亦然。
實(shí)例:
class Person:
def object_faunc(self):
print('對(duì)象方法')
# 聲明一個(gè)類方法
@classmethod
def class_func(cls):
print('這是一個(gè)類方法')
@staticmethod
def static_func():
print('這是一個(gè)靜態(tài)方法')
class Person:
# 類的字段,存儲(chǔ)人類的數(shù)量
number = 61
@classmethod
def show_number(cls):
print('人類的數(shù)量是%d億'% (cls.number))
@staticmethod
def sho_numbers():
print('人類的數(shù)量是%d億' % (Person.number))
Person.show_number()
Person.sho_numbers()