類和對(duì)象
一般編程思想
1.面向過(guò)程編程-->算法,邏輯
2.函數(shù)式編程-->函數(shù)
3.面向?qū)ο缶幊?->類和對(duì)象
類的聲明
1.什么是類
類是擁有相同屬性和相同功能的對(duì)象的集合(抽象的)
對(duì)象就是類的實(shí)例(具體的)
2.類的聲明
格式: class 類名(父類列表):
類的說(shuō)明文檔
類的內(nèi)容
說(shuō)明:
class-->python中聲明類的關(guān)鍵字
類名-->標(biāo)識(shí)符,不能是關(guān)鍵字;類名使用駝峰式命名,并且首字母大寫;見(jiàn)名知義
(父類列表)-->繼承語(yǔ)法,讓聲明的類繼承括號(hào)中的父類。這個(gè)結(jié)構(gòu)可以省略,讓當(dāng)前類繼承python的基類:object
:-->固定結(jié)構(gòu)
類的說(shuō)明文檔-->注釋,對(duì)類進(jìn)行說(shuō)明。格式是三個(gè)雙引號(hào)
類的內(nèi)容-->包含屬性(存數(shù)據(jù)的變量)和方法(聲明在類中的函數(shù))
駝峰式命名:如果一個(gè)名字由多個(gè)單詞組成,第一個(gè)單詞首字母小寫。userName
PEP8命名規(guī)范:如果一個(gè)名字由多個(gè)單詞組成,所有字母小寫,多個(gè)單詞之間用下劃線隔開。變量和函數(shù)采用PEP8命名.user_name
3.對(duì)象的聲明
語(yǔ)法: 對(duì)象名=類名()
說(shuō)明:
對(duì)象名-->變量名
類名-->需已聲明過(guò)的類
如p1=Person()
對(duì)象方法
1.類的內(nèi)容包含屬性和方法,方法分為對(duì)象方法、類方法和靜態(tài)方法
2.對(duì)象方法:直接聲明在類中的函數(shù)。對(duì)象方法都有一個(gè)默認(rèn)參數(shù)self,通過(guò)對(duì)象來(lái)調(diào)用
3.對(duì)象方法的調(diào)用:對(duì)象.方法名()
調(diào)用對(duì)象方法時(shí),不需要給默認(rèn)參數(shù)self傳參,系統(tǒng)會(huì)自動(dòng)將當(dāng)前對(duì)象傳遞給self(傳參)
4.self:誰(shuí)調(diào)用當(dāng)前的對(duì)象方法,self就指向誰(shuí)。self就是當(dāng)前類的對(duì)象,類的對(duì)象能做的,self都能做
構(gòu)造方法和init方法
1.構(gòu)造方法
構(gòu)造方法就是函數(shù)名和類名一樣的方法,作用是用來(lái)創(chuàng)建對(duì)象的。聲明類的時(shí)候,系統(tǒng)會(huì)自動(dòng)為這個(gè)類創(chuàng)建對(duì)應(yīng)的構(gòu)造方法
創(chuàng)建對(duì)象的過(guò)程:調(diào)用構(gòu)造方法在內(nèi)存中開辟空間創(chuàng)建對(duì)象,并且會(huì)自動(dòng)調(diào)用__init__方法去對(duì)這個(gè)對(duì)象進(jìn)行初始化。最后將創(chuàng)建好的對(duì)象地址返回
2.__init__方法
對(duì)象方法
不需要手動(dòng)調(diào)用,創(chuàng)建完對(duì)象后,會(huì)被自動(dòng)調(diào)用
3.帶參,其他參數(shù)的init方法
__init__方法的參數(shù)要通過(guò)構(gòu)造方法來(lái)傳。(構(gòu)造方法的實(shí)參,會(huì)傳遞給init方法的形參)
對(duì)象的屬性
類的內(nèi)容包含屬性和方法,屬性又分為對(duì)象屬性和類的字段
屬性:用來(lái)在類中區(qū)保存數(shù)據(jù)的變量。
對(duì)象屬性:屬性的值會(huì)因?yàn)閷?duì)象不同而不同,這種屬性就需要聲明成對(duì)象屬性,例如人的名字年齡等。通過(guò)對(duì)象來(lái)使用
1.對(duì)象屬性的聲明
a.必須聲明在__init__方法中
b.聲明格式:self.屬性=初值
2.使用對(duì)象屬性
格式:對(duì)象.屬性
#創(chuàng)建不同對(duì)象的時(shí)候可以確定不同屬性值
class Person2:
def __init__(self,name1,age1,sex1):
self.name=name1
self.age=age1
self.sex=sex1
p1=Person2('ann',23,'female')
print(p1.name)
ann
3.對(duì)象屬性的增刪改查
a.查(獲取對(duì)象屬性的值)
需先創(chuàng)建對(duì)象后再查
方法1:對(duì)象.屬性-->獲取指定屬性值,屬性不存在會(huì)報(bào)錯(cuò)
方法2:getattr(對(duì)象,屬性名,默認(rèn)值)-->獲取指定屬性值,當(dāng)屬性不存在時(shí),如果設(shè)置了默認(rèn)值,不會(huì)報(bào)錯(cuò)并將默認(rèn)值作為結(jié)果。(如果沒(méi)有設(shè)置默認(rèn)值,屬性不存在則會(huì)報(bào)錯(cuò))
方法3:對(duì)象.__getattribute__(屬性名)-->獲取指定屬性值
class Student:
def __init__(self,name='',age=0,study_id='001'):
self.name=name
self.age=age
self.study_id=study_id
stu1=Student('anny')
print(stu1.name)
print(getattr(stu1,'name2','king'))
print(stu1.__getattribute__('age'))
anny
king
0
b.增/改(給對(duì)象添加屬性)
注意:只能針對(duì)某個(gè)特定對(duì)象增加/更改屬性,不影響其他對(duì)象。
方法1:對(duì)象.屬性=值
屬性不存在時(shí)可給對(duì)象添加屬性,屬性存在時(shí)就是修改
方法2:setattr(對(duì)象,屬性名,屬性值)
方法3:對(duì)象.__setattr__(屬性名,屬性值)
c.刪除(刪除對(duì)象屬性)
注意:只能針對(duì)某個(gè)特定對(duì)象刪除屬性,不影響其他對(duì)象。
方法1:del 對(duì)象.屬性
方法2:delattr(對(duì)象,屬性名)
方法3:對(duì)象..__delattr__(屬性名)
4.對(duì)象的使用
python中所有的數(shù)據(jù)都是對(duì)象,所有的變量存儲(chǔ)的都是對(duì)象的地址。
a.將對(duì)象給別的變量賦值
賦值:產(chǎn)生新的對(duì)象,將新的地址賦值時(shí),最好import copy模塊后,使用淺拷貝copy.copy(拷貝對(duì)象)
b.將對(duì)象作為列表的元素
定制當(dāng)前類對(duì)象的打印格式
def __str__(self):
return str(self.__dict__)
slots魔法
屬性:對(duì)象屬性,類的字段
類的字段:聲明在類里面,函數(shù)外面的變量就是類的字段。使用的時(shí)候通過(guò)類來(lái)使用:類.字段
格式
__slots__:用來(lái)約束當(dāng)前類的對(duì)象屬性有哪些
內(nèi)置類屬性
1.__name__ -->獲取當(dāng)前類的名字(字符串)
2.__doc__ -->獲取類的說(shuō)明文檔
3.__class__ -->通過(guò)對(duì)象.__class__獲取對(duì)象的類
4.類.__dict__ -->獲取當(dāng)前類所有類的字段和其對(duì)應(yīng)的值,以字典形式返回
對(duì)象.__dict__-->獲取當(dāng)前對(duì)象所有的屬性和其對(duì)應(yīng)的值,以字典的形式返回
class Dog:
"""狗類"""
#num此處為類的字段
num=10
__slots__ = ('color','name','type')
def __init__(self,color,name,type):
self.color=color
self.name=name
self.type=type
def run(self):
print('%s is sleeping'%self.name)
dog1=Dog('白色','小靜','哈巴狗')
print(Dog.__name__,type(Dog.__name__))
print(Dog.__doc__)
print(Dog.__dict__)
Dog <class 'str'>
狗類
{'module': 'main', 'doc': '狗類', 'num': 100, 'slots': ('color', 'name', 'type'), 'init': <function Dog.init at 0x000001DD58FB0A60>, 'run': <function Dog.run at 0x000001DD58FB0D90>, 'color': <member 'color' of 'Dog' objects>, 'name': <member 'name' of 'Dog' objects>, 'type': <member 'type' of 'Dog' objects>}
5.類.__module__ -->獲取當(dāng)前類所在的模塊
6.類.__bases__ -->獲取當(dāng)前類的父類,返回的是一個(gè)元祖,元祖的元素是類