1.類和對(duì)象
定義:
- 類:就是擁有相同功能和相同屬性的對(duì)象的集合(類是抽象)
- 對(duì)象:類的實(shí)例(對(duì)象是具體的)
2.類的申明
類:對(duì)擁有相同功能(方法)和相同屬性(屬性)的封裝。
封裝效果:一個(gè)類中可以對(duì)多個(gè)功能進(jìn)行封裝(多個(gè)函數(shù));封裝多個(gè)屬性
2.11.類的聲明格式
class 類名(父類列表):
類的說(shuō)明文檔
類的內(nèi)容
說(shuō)明
class:聲明類的關(guān)鍵字
類名:標(biāo)識(shí)符,不能是關(guān)鍵字。駝峰式命名(第一個(gè)單詞首字母小寫(xiě)其他的單詞首字母都大寫(xiě)),首字母大寫(xiě)?。。?,見(jiàn)名知義
例如:Person、StudentSystem
(父類列表): 部分可以省。 這個(gè)是繼承語(yǔ)法,可以多繼承
冒號(hào):固定的
類的內(nèi)容:包括類的方法和類的屬性
3.1構(gòu)造方法和init方法
-
構(gòu)造方法:系統(tǒng)自動(dòng)創(chuàng)建的,方法名和類名一樣。構(gòu)造方法是用來(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方法(不用主動(dòng)調(diào)用init方法)
class Dog:
def _ _init_ _(self,name1,age1): name1...形參
self.name=name1 #初始化對(duì)象屬性
self.age1=age1
dog1=Dog('大黃',3) #通過(guò)構(gòu)造方法創(chuàng)建對(duì)象,并給init函數(shù)傳參
4.對(duì)象屬性及增刪改查
4.1.屬性:是類中的內(nèi)容,(保存值的)
對(duì)象的屬性:不同的對(duì)象,對(duì)應(yīng)的值可能不一樣,這樣的屬性是對(duì)象屬性。屬于對(duì)象
類中的對(duì)象屬性是聲明在init方法中的,并且聲明格式是:self.屬性名 = 初值
對(duì)象屬性的使用:對(duì)象.屬性名
4.2 對(duì)象屬性的增刪改查
python是動(dòng)態(tài)語(yǔ)言,python中類的對(duì)象的屬性可以進(jìn)行增刪的操作
a.查(獲取屬性的值)
方法一: 對(duì)象.屬性
print(p1.name2) # 屬性不存在會(huì)報(bào)錯(cuò)
方法二: def getattr(對(duì)象, 屬性名, 默認(rèn)值)
print(getattr(p1, 'age2')) # 屬性不存在會(huì)報(bào)錯(cuò)
print(getattr(p1, 'age2', 0)) # 屬性不存在可以通過(guò)設(shè)置默認(rèn)值,讓程序不崩潰,并且返回默認(rèn)值
方法三:對(duì)象.getattribute(屬性名)
height = p1.__getattribute__('height')
b.改(修改屬性的值,屬性值存在)
方法一:對(duì)象.屬性 = 新值
方法二: 通過(guò)函數(shù) setattr(對(duì)象,屬性名, 新值)
方法三: 對(duì)象.setattr(屬性名, 新值)
p1.name = '李四'
setattr(p1, 'age', 20)
print(p1.age)
p1.__setattr__('height', 170)
print(p1.height)
c.增 (添加屬性 -- 屬性不存在)
注意:添加屬性只能給某一個(gè)對(duì)象添加對(duì)應(yīng)的屬性
方法一:對(duì)象.屬性 = 值
方法二: def setattr(對(duì)象,屬性名, 值)
方法三: 對(duì)象.setattr(屬性名, 值)
d.刪(刪除對(duì)象屬性)
注意:刪除只針對(duì)指定的對(duì)象
方法一: del 對(duì)象.屬性
方法二:delattr(對(duì)象, 屬性名)
方法三: 對(duì)象.delattr(屬性名)
51.對(duì)象方法:
a.什么樣的方法是對(duì)象方法:直接聲明在類的函數(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í)
import math
class Circle:
def __init__(self, radius1):
self.radius = radius1
# 聲明一個(gè)對(duì)象方法area
# 在這兒,self就是調(diào)用area方法的對(duì)象。對(duì)象能做的事情,self都可以做
def area(self):
# print(id(self))
# print(self.radius)
# self.radius = 100
# print('求圓的面積')
return math.pi * (self.radius ** 2)
6.類的字段及類的方法
6.1 類的屬性叫類的字段
- a.什么是類的字段:
類的字段就是聲明在類的里面,方法的外面的變量 - b.什么樣的屬性聲明成類的字段:
屬于類的,對(duì)于這個(gè)類的所有的對(duì)象來(lái)說(shuō)其值是共有的 - c.怎么使用:
通過(guò)類來(lái)使用: 類.字段
class Person:
# 這個(gè)number就是類的字段
number = 61
6.2類中的方法:
6.21.對(duì)象方法(實(shí)例方法)
- 聲明的形式:直接聲明在類型
- 特點(diǎn):自帶一個(gè)不需要主動(dòng)傳參的默認(rèn)參數(shù)self, 誰(shuí)來(lái)調(diào)用指向誰(shuí)
- 調(diào)用:通過(guò)對(duì)象來(lái)調(diào)用
6.2.2.類方法
- 聲明的形式:聲明方法前需要使用@classmethod說(shuō)明
- 特點(diǎn):自帶一個(gè)默認(rèn)參數(shù)cls,這個(gè)參數(shù)調(diào)用的時(shí)候不需要傳值。系統(tǒng)自動(dòng)給他傳。誰(shuí)調(diào)用就指向誰(shuí)!,始終指向當(dāng)前類
- 調(diào)用:通過(guò)類來(lái)調(diào)用 -> 類.類方法()
6.2.3.靜態(tài)方法
- 聲明的形式:聲明方法前需要使用@staticmethod說(shuō)明
- 特點(diǎn): 沒(méi)有默認(rèn)的參數(shù)
- 調(diào)用: 通過(guò)類來(lái)調(diào)用 -> 類.靜態(tài)方法()
class Class1:
# 類字段
number = 100
# 聲明一個(gè)對(duì)象方法
def object_func(self):
print('對(duì)象方法')
# 聲明一個(gè)類方法
@classmethod
def class_func(cls):
# 通過(guò)cls去使用類的字段
print('cls:', cls.number)
# 通過(guò)cls去創(chuàng)建對(duì)象
tc = cls()
tc.object_func()
print('這是一個(gè)類方法')
@staticmethod
def static_func():
print('這是一個(gè)靜態(tài)方法')
c1 = Class1() # 調(diào)用對(duì)象方法
c1.object_func()
print(Class1.number) # 調(diào)用類方法
Class1.class_func()
Class1.static_func() # 調(diào)用靜態(tài)方法
6.2.4.遇到問(wèn)題怎么來(lái)選擇使用哪種方法:
a.只要實(shí)現(xiàn)方法的功能需要用到對(duì)象的屬性,我們就使用對(duì)象方法
b.不使用對(duì)象方法的前提下,如果實(shí)現(xiàn)功能需要用到類的字段就使用類方法
c.實(shí)現(xiàn)功能既不需要對(duì)象的屬性,又不需要類的字段就使用靜態(tài)方法
注意:靜態(tài)方法和類方法劃分不用那么嚴(yán)格,靜態(tài)方法能做的類方法可以做,反之亦然