1 編程思想:
1.1 面向過程編程 - 工具:邏輯鸣戴、算法
遇到問題考慮直接用代碼栓霜;把邏輯思維轉(zhuǎn)換成代碼蜕青,解決問題苟蹈。
1.2 函數(shù)式編程 - 工具:函數(shù)
遇到問題糊渊,就考慮是否有一個(gè)這種功能的函數(shù)右核。
1.3 面向?qū)ο缶幊?- 工具:類和對(duì)象
遇到問題,就考慮是否有一個(gè)對(duì)象能夠幫我解決問題渺绒。
2 類的聲明
類:就是擁有相同屬性和相同功能的對(duì)象的集合(類是抽象的)贺喝。
對(duì)象:類的實(shí)例(對(duì)象是具體的)。
2.1 類的聲明
語法:
class 類名(父類列表):
類的內(nèi)容
說明:
class - 聲明類的關(guān)鍵字
類名 - 標(biāo)識(shí)符宗兼,不能是關(guān)鍵字躏鱼;
類名采用駝峰式命名,并且首字母大寫
見名知義
(父類列表)- 繼承語法殷绍;可以省略染苛,省略的時(shí)候相當(dāng)于(object)
類的內(nèi)容 - 主要包含屬性和方法。
駝峰式命名:名字由多個(gè)單詞組成的時(shí)候主到,通過單詞首字母大寫來區(qū)分不同的單詞茶行。studnetName;userName;userId。
方法:聲明在類中的函數(shù)就是方法登钥。
2.2 屬性和方法
類中的屬性 - 指的是在類中聲明的變量畔师;分為類的字段和對(duì)象屬性。
類中的方法 - 指的是在類中聲明的函數(shù)牧牢;分為對(duì)象方法看锉,類方法和靜態(tài)方法。
class Person: # 聲明了一個(gè)Person類
"""人類"""
# 屬性
num=61 # 字段
# 方法
def eat(self):
print('吃飯')
2.3 創(chuàng)建對(duì)象
類名()-->創(chuàng)建類對(duì)應(yīng)的對(duì)象塔鳍。
3 對(duì)象方法
3.1 什么是對(duì)象方法
直接聲明在類中伯铣,并且自帶一個(gè)叫self的參數(shù)的函數(shù)。
3.2 對(duì)象方法的調(diào)用
對(duì)象方法的調(diào)用 - 通過對(duì)象調(diào)用對(duì)象方法
對(duì)象.對(duì)象方法()
通過對(duì)象調(diào)用對(duì)象方法的時(shí)候轮纫,對(duì)象方法中的第一個(gè)參數(shù)self不用傳參腔寡,系統(tǒng)會(huì)自動(dòng)將當(dāng)前對(duì)象傳給self,哪個(gè)對(duì)象調(diào)用的蜡感,self就指向誰蹬蚁。
注意:當(dāng)前類的對(duì)象能做的事情,self都能做郑兴。
# 聲明Person類
class Person:
"""人類"""
# 聲明了一個(gè)對(duì)象方法sleep
def sleep(self,a):
# self=p1犀斋,a=10
print('睡覺',a)
# 創(chuàng)建Perosn的對(duì)象p1
p1=Person()
4 init方法和構(gòu)造方法
4.1 魔法方法
python類中,用__開頭并且由__結(jié)尾的方法情连,就是魔法方法叽粹。魔法方法不需要主動(dòng)調(diào)用,都會(huì)自動(dòng)調(diào)用。
4.2__init__方法
1.是對(duì)象方法虫几;
2.不需要自己調(diào)用锤灿,會(huì)被自動(dòng)調(diào)用;
3.專門用來對(duì)對(duì)象進(jìn)行初始化的辆脸。
4.3 構(gòu)造方法
概念:函數(shù)名和類名一樣的函數(shù)但校,就是構(gòu)造方法。
1.當(dāng)我們創(chuàng)建類的時(shí)候啡氢,系統(tǒng)會(huì)自動(dòng)創(chuàng)建這個(gè)類的構(gòu)造方法状囱,用來創(chuàng)建對(duì)象。
2.當(dāng)我們通過構(gòu)造方法創(chuàng)建對(duì)象的時(shí)候倘是,系統(tǒng)會(huì)自動(dòng)調(diào)用init方法來對(duì)創(chuàng)建好的對(duì)象進(jìn)行初始化亭枷。
注意:當(dāng)init方法中,除了self以外如果需要?jiǎng)e的參數(shù)搀崭,那么這些參數(shù)是通過構(gòu)造方法來傳的參
只要調(diào)用了構(gòu)造方法就會(huì)產(chǎn)生新的對(duì)象叨粘,即使傳入的參數(shù)一樣(想要對(duì)象,調(diào)用構(gòu)造方法)瘤睹。
5 對(duì)象屬性
5.1.什么是對(duì)象屬性
1.聲明在init方法中
2.self.屬性名=值
3.通過對(duì)象使用:對(duì)象.屬性
語法:
self.變量名=值
說明:變量名就是屬性名升敲,這個(gè)變量就是對(duì)象屬性
5.2什么樣的屬性應(yīng)該聲明為對(duì)象屬性
如果屬性的值會(huì)因?yàn)閷?duì)象不同而不一樣,那這樣的屬性就應(yīng)該聲明成對(duì)象屬性默蚌。反之就聲明為類的字段冻晤。
5.2.1對(duì)象屬性創(chuàng)建使用默認(rèn)值
class Person:
def __init__(self):
# 這兒的name和age就是Person類的對(duì)象屬性
self.name='李四'
self.age=0
p1=Person() # 創(chuàng)建對(duì)象
p1.name='張三' # 對(duì)對(duì)象的name屬性進(jìn)行修改
5.2.2創(chuàng)建對(duì)象的時(shí)候就決定對(duì)象屬性的值
class Person:
# name1是參數(shù)名,self.name中的name是屬性名
def __init__(self,name1,age=1):
self.name=name1
self.age=age
p11=Person('小紅')
p12=Person('小花')
練習(xí):聲明一個(gè)point類绸吸,擁有屬性x坐標(biāo)和y坐標(biāo)鼻弧。功能:求兩個(gè)點(diǎn)之間的距離
class Point:
def __init__(self,x,y):
self.x=x
self.y=y
def distance(self,other):
return ((self.x-other.x)**2+(self.y-other.y)**2)**0.5
pp1=Point(2,3)
pp2=Point(5,7) # pp1調(diào)用distance函數(shù),故self就是pp1對(duì)象锦茁,other是pp2對(duì)象
print(pp1.distance(pp2))# 5.0
6 對(duì)象屬性的增刪改查
注意:對(duì)象屬性的增刪改查攘轩,都是針對(duì)指定的那一個(gè)對(duì)象,不會(huì)影響其他對(duì)象码俩。
class Dog:
def __init__(self,name,color,type):
self.name=name
self.color=color
self.type=type
dog1=Dog('旺財(cái)','黃色','二哈')
6.1 查(獲取對(duì)象屬性的值)
1.對(duì)象.屬性 - 當(dāng)屬性不存在的時(shí)候會(huì)報(bào)錯(cuò)
2.getattr(對(duì)象度帮,屬性名,默認(rèn)值) - 當(dāng)屬性不存在的時(shí)候稿存,如果設(shè)置了默認(rèn)值笨篷,程序不崩潰,而是返回默認(rèn)值瓣履。
print(dog1.name) # 旺財(cái)
# print(dog1.sex) # AttributeError
print(getattr(dog1,'color')) # 黃色
print(getattr(dog1,'sex','才才')) # 才才
6.2增率翅、改
1對(duì)象.屬性 = 值
2.setattr(對(duì)象,屬性名袖迎,值)
注意:屬性存在的時(shí)候冕臭,對(duì)應(yīng)的功能是修改屬性的值腺晾。當(dāng)屬性不存在的時(shí)候是添加屬性。
dog1.name='大黃' # 修改
print(dog1.name) # 大黃
dog1.sex='雄' # 添加
print(dog1.sex) # 雄
setattr(dog1,'name','熱狗') # 修改
print(dog1.name) # 熱狗
setattr(dog1,'name2','肉狗') # # 添加
print(dog1.name2) # 肉狗
6.3 刪除
- del 對(duì)象.屬性
2.delattr(對(duì)象辜贵,屬性名)
del dog1.name # 刪除
print(dog1.name) # AttributeError
delattr(dog1,'color') # 刪除
print(dog1.color) # AttributeError
6.4 設(shè)置魔法 slots魔法
slots是用來約束當(dāng)前這個(gè)類有哪些屬性悯蝉。
class Student:
# Student類的對(duì)象只能有name,study_id托慨,age和sex屬性
__slots__ = ('name','study_id','age','sex')
def __init__(self,name,age):
self.name=name
self.study_id='001'
self.age=age
7 類的字段和內(nèi)置類屬性
7.1 類的字段
1.直接聲明在類里面鼻由,函數(shù)的外面的變量就是類的字段
2.類的字段需要通過類來使用 : 類.字段 - (不管是在類的里面還是類的外面都一樣通過類來使用)
(在類中聲明一個(gè)函數(shù)就是相當(dāng)于聲明一個(gè)字段)
3.不會(huì)因?yàn)閷?duì)象不同而不一樣的數(shù)據(jù)就聲明成類的字段。
class Person:
# 聲明了一個(gè)字段number
number=61
print(Person.number) # 61
7.2 內(nèi)置類屬性
內(nèi)置屬性就是聲明類的時(shí)候榴芳,類中已經(jīng)聲明好的屬性(包含類的字段和對(duì)象的屬性)嗡靡。
class Dog:
"""說明文檔:狗類"""
# 類的字段
type='犬科'
# 對(duì)象屬性
def __init__(self,name='狗',age=5,color='白'):
self.name=name
self.age=age
self.color=color
# 對(duì)象方法
def eat(self,food):
print('%s在吃%s'%(self.name,food))
# 類方法
@classmethod
def shout(cls):
print('wangwnag...')
# 靜態(tài)方法
@staticmethod
def bite():
print('狗咬人')
dog1=Dog('小黑',3,'黑色')
7.2.1 __name__
類.__name__ - 獲取類的名字(字符串)
class_name=Person.__name__
print( class_name,type( class_name)) # Person ,<class 'str'>
7.2.2__class__
對(duì)象.__class__ - 獲取對(duì)象對(duì)應(yīng)的類(結(jié)果是一個(gè)類,原來類能做的事情它都能可以做)
aa=dog1.__class__
d1=Dog()
d2=aa()
print(d1,d2)
print(Dog.type) # 犬科
print(aa.type) # 犬科
print(dog1.__class__.__name__) # Dog
7.2.3 __dict__
類.__dict__ - 獲取當(dāng)前類的所有的類的字段及其對(duì)應(yīng)的值.
(重點(diǎn))對(duì)象.__dict__ - 將當(dāng)前對(duì)象所有的對(duì)象屬性及其值轉(zhuǎn)換成字典窟感,key是屬性名,value是屬性的值
如果給類的slots賦了值歉井,那么這個(gè)類的對(duì)象的dict屬性就不能用了
# 用類調(diào)用柿祈,獲取所有類的字段
print(Dog.__dict__) # {'__module__': '__main__', 'type': '犬科', '__init__':.....}
# 用對(duì)象調(diào)用,將對(duì)象的屬性及其值轉(zhuǎn)換成字典哩至,重點(diǎn)
print(dog1.__dict__) # {'name': '小黑', 'age': 3, 'color': '黑色'} # 數(shù)據(jù)本地化及傳輸時(shí)經(jīng)常用到
7.2.4 __base__
類.__base__ - 獲取當(dāng)前類的父類(以元祖的形式返回躏嚎,元祖中的元素就是類的父類)
print(Dog.__bases__) # (<class 'object'>,)
7.2.5 __module__
類.__module__ - 獲取當(dāng)前類所在的模塊的模塊名
print(Dog.__module__) # __main__ 當(dāng)就在目前正在執(zhí)行的模塊時(shí),返回main菩貌,否則返回文件名
7.3 __doc__
類.__doc__ -獲取類的說明文檔
print(Dog.__doc__) # 說明文檔:狗類