編程方式
面向過(guò)程:以算法為工具
函數(shù)式編程:以函數(shù)為工具
面向?qū)ο缶幊?以類和對(duì)象為工具
1.類的聲明
類:對(duì)擁有相同功能和相同屬性的對(duì)象的集合
對(duì)象:類的實(shí)例
封裝效果:一個(gè)類中可以對(duì)多個(gè)功能進(jìn)行封裝(多個(gè)函數(shù))
類聲明格式:
class 類名(父類列表):
類的內(nèi)容
2.說(shuō)明:
class:聲明類的關(guān)鍵字
類名:標(biāo)識(shí)符此熬,不能是關(guān)鍵字模闲,駝峰式命名(第一個(gè)單詞首字母小寫,其他的單詞首字母大寫)首字母大寫<八搿!厚脉!央拖,見(jiàn)名知義
例如:Person、StudentSystem
(父類列表):這個(gè)部分可以省略垮卓,這個(gè)是繼承語(yǔ)法垫桂,可以有多繼承
冒號(hào):固定寫法
類的內(nèi)容:類的內(nèi)容包括類的方法和類的屬性
3.類中的方法:就是聲明在類中的函數(shù)
方法:
a.對(duì)象方法:對(duì)象方法需要通過(guò)對(duì)象來(lái)調(diào)用,對(duì)象.函數(shù)名()
直接寫在類中的方法粟按,自帶一個(gè)self參數(shù)
b.創(chuàng)建類的時(shí)候诬滩,系統(tǒng)會(huì)默認(rèn)給我們創(chuàng)建這個(gè)類對(duì)應(yīng)的構(gòu)造方法
構(gòu)造方法:類名()--->創(chuàng)建類對(duì)應(yīng)的對(duì)象霹粥,只有在調(diào)用構(gòu)造方法的時(shí)候才會(huì)產(chǎn)生新的對(duì)象
調(diào)用對(duì)象方法:對(duì)象.方法()
1).構(gòu)造方法:系統(tǒng)自動(dòng)創(chuàng)建的,方法名和類名一樣疼鸟,用來(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 Person:
def __init__(self):
print('初始化...')
def eat(self):
print('吃飯')
if __name__ =='__main__':
p1=Person() #創(chuàng)建Person類的對(duì)象,并且將對(duì)象的地址存到p1中
p1.eat() #調(diào)用對(duì)象方法
創(chuàng)建對(duì)象的過(guò)程:調(diào)用構(gòu)造方法在內(nèi)存中開辟一個(gè)對(duì)象空镜,然后用新建的這個(gè)對(duì)象去調(diào)用init方法
來(lái)初始化對(duì)象的屬性浩淘,最后才將對(duì)象返回
class Person:
#init方法可以添加參數(shù)
def __init__(self,name):
print(name)
if __name__=='__main__':
p1=Person('hello')
4 .類字段和類方法
類中的內(nèi)容:屬性和方法
1).屬性:
a.對(duì)象的屬性:不同的對(duì)象,對(duì)應(yīng)的值可能不一樣姑裂,這樣的屬性時(shí)對(duì)象屬性馋袜,屬于對(duì)象
b.類的字段:屬于類的,所有的對(duì)象對(duì)應(yīng)的值是一樣的
類中對(duì)象的屬性聲明再init方法中的舶斧,并且聲明格式是:self.屬性名 = 初值
***對(duì)象的屬性必須是全部傳入的
class Student:
def __init__(self,name,age):
self.name = name
self.age = age
def print_info(self):
print(self.name,end='')
print(self.age)
if __name__ == '__main__':
s1=Student('張三',18)
s1.print_info()
s2=Student('李四',20)
s2.print_info()
***對(duì)象的屬性時(shí)默認(rèn)的
class Student:
def __init__(self):
self.name = '張三'
self.age = 18
self.id = 1
def print_info(self):
print(self.name,self.age,self.id)
if __name__ == '__main__':
s1 = Student()
s1.print_info()
s1.name = '李四'
s1.age = 20
s1.id = 2
s1.print_info()
***對(duì)象的屬性部分傳入部分默認(rèn)
class Person:
class_p ='white person'
def __init__(self,id):
self.name = '張三'
self.age = '20'
self.id = id
if __name__ == '__main__':
p = Person(10)
print(Person.class_p)
print(p.class_p)
對(duì)象的屬性通過(guò)(對(duì)象.屬性)去使用對(duì)象的屬性欣鳖,也可以通過(guò)(對(duì)象.屬性)去修改對(duì)象的屬性
練習(xí):寫一個(gè)矩形類,擁有屬性長(zhǎng)和寬
class Rect:
def __init__(self,width,height):
self.height=height
self.width=width
def print_info(self):
print(self.width,self.height)
if __name__ == '__main__':
r = Rect(20,30)
r2 = Rect(30,40)
r.print_info()
r2.print_info()
5.對(duì)象屬性的增刪改查
python是動(dòng)態(tài)語(yǔ)言茴厉,python中類的對(duì)象的屬性可以進(jìn)行增刪的的操作
class Person:
def __init__(self):
self.name ='張三'
self.age = 18
self.height = 160
if __name__=='__main__':
p1 = Person()
#查(獲取屬性的的值)
'''
方法一:對(duì)象.屬性名泽台,當(dāng)這個(gè)屬性名不存在的時(shí)候,會(huì)報(bào)AttributeError錯(cuò)誤
'''
print(p1.name)
'''
方法二:通過(guò)內(nèi)置函數(shù)getattr(object,name,default=None)
object:指定對(duì)象
name:屬性名字,字符串
defalut:如果設(shè)置了默認(rèn)值矾缓,而要取的屬性不存在怀酷,會(huì)取回默認(rèn)值,程序不會(huì)崩潰嗜闻,
如果沒(méi)有設(shè)置默認(rèn)值蜕依,要取的屬性不存在,會(huì)報(bào)錯(cuò)AttributeError
'''
print(getattr(p1,'name',0)) #0
print(getattr(p1,'name')) #Attribute
'''
方法三對(duì)象.__getattribute__(屬性名)
屬性名:是一個(gè)字符串
'''
print(p1.__getattribute__('name'))
#2.改(修改屬性的值)
'''
方法一:對(duì)象.屬性 = 新值
方法二: def setattr(對(duì)象琉雳,屬性名样眠,新值)
方法三:對(duì)象.__setattr__(屬性名,新值)
'''
p1.name = 'hello'
print(p1.name)
setattr(p1,'name','world')
print(p1.name)
p1.__setattr__('name','python')
print(p1.name)
'''
3.增加(添加屬性)
增加的語(yǔ)法和修改的語(yǔ)法一模一樣翠肘,屬性值存在就是修改檐束,屬性值不存在的時(shí)候就是添加
方法一:對(duì)象.新屬性 = 初值
方法二: def setattr(對(duì)象,新屬性名束倍,初值)
方法三:對(duì)象.__setattr__(新屬性名被丧,初值)
注意:添加屬性只能給某一個(gè)對(duì)象添加屬性
p1.sex = '女'
print(p1.sex)
setattr(p1,'weight',45)
print(p1.weight)
p1.__setattr__('color','red')
print(p1.color)
類也可以以這樣的方式添加屬性
'''
'''
4.刪除
方法一:del 對(duì)象.屬性
方法二:delattr(objject,屬性名)
第一個(gè)參數(shù)是對(duì)象,第二個(gè)參數(shù)是屬性名
delattr(p1,'age')
方法三:對(duì)象.__delattr__(屬性名)
注意:刪除只針對(duì)某一個(gè)單獨(dú)的對(duì)象
'''
del p1.name
print(p1.name)
delattr(p1,'age')
print(p1.age)
p1.__delattr__('name')
print(p1.name)
6.對(duì)象方法
a.什么是對(duì)象方法:對(duì)象方法就是寫在類里面的方法默認(rèn)全部是對(duì)象方法绪妹,對(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邮旷,誰(shuí)調(diào)用self格嘁,self就是誰(shuí)
import math
class Circle:
pi = math.pi
def __init__(self,radius):
self.radius = radius
#聲明一個(gè)對(duì)象方法area
#在這兒,self就是調(diào)用area方法的對(duì)象廊移,對(duì)象能做的事糕簿,self都可以做,相當(dāng)于java里的this.
def area(self):
print(id(self))
return self.radius**2*Circle.pi
if __name__ == '__main__':
c1 =Circle(10)
print(id(c1))
print(c1.area())
練習(xí)1:寫一個(gè)矩形類有屬性長(zhǎng)和寬狡孔,有兩個(gè)功能分別是求周長(zhǎng)和面積
class Rect:
def __init__(self,length,width):
self.length = length
self.width = width
#對(duì)象方法是否需要額外參數(shù)懂诗,看實(shí)現(xiàn)函數(shù)的功能需不需要除了對(duì)象屬性以外的其他的數(shù)據(jù)
def perimeter(self):
return (self.length+self.width)*2
def area(self):
return self.length*self.width
練習(xí)2:寫一個(gè)班級(jí)類,班級(jí)里面有多個(gè)學(xué)生的成績(jī)(一門)苗膝,可以獲取班級(jí)成績(jī)中的最高分
class Class:
'''
班級(jí)類
'''
def __init__(self,classname):
self.scores = []
self.classname = classname
def get_high_score(self):
if self.scores:
return max(self.scores)
return None
if __name__=='__main__':
c1=Class('001')
c1.scores=[10,20,5,25,76,1]
print(c1.get_high_score())
d.類的字段
類的屬性叫類的字段
a.什么是類的字段:類的字段就是聲明在類中殃恒,函數(shù)的外面的變量,叫做類的字段
class Person:
#這個(gè)number就是類的字段
number = 10
if __name__ == '__main__':
print(Person.number)
b.什么樣的屬性聲明成類的字段
不同的對(duì)象對(duì)應(yīng)的值都是一樣的辱揭,他是屬于所有對(duì)象公有的屬性离唐,是屬于類的。
c.怎么使用
通過(guò)類來(lái)使用:類.字段
練習(xí):寫一個(gè)類问窃,用一個(gè)屬性來(lái)保存這個(gè)類創(chuàng)建的對(duì)象的個(gè)數(shù)
class Person:
count = 0
def __init__(self):
Person.count +=1
if __name__=='__main__':
p1=Person()
p1=Person()
p1=Person()
p1=Person()
print(Person.count)
e.類的方法
類中的方法:
1.對(duì)象方法(實(shí)例方法)
直接聲明再類中亥鬓,自帶一個(gè)不需要主動(dòng)傳參的默認(rèn)參數(shù)self,誰(shuí)來(lái)調(diào)用指向誰(shuí)
調(diào)用:通過(guò)對(duì)象來(lái)調(diào)用
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)用->類.類方法
cls:就是當(dāng)前類,可以創(chuàng)建對(duì)象听皿,調(diào)用類的屬性和方法
3.靜態(tài)方法
聲明方法前需要使用@staticmethod說(shuō)明
特點(diǎn):沒(méi)有默認(rèn)參數(shù),靜態(tài)方法不能在繼承中修改
調(diào)用:通過(guò)類來(lái)調(diào)用-->類.靜態(tài)方法()
類方法聲明格式
Class Person:
#聲明一個(gè)對(duì)象方法
def object_func(self):
print('對(duì)象方法')
#聲明類方法
@classmethod
def class+func(cls):
print('這是一個(gè)類方法')
#聲明靜態(tài)方法
@staticmethod()
def static_func():
print('這是一個(gè)靜態(tài)方法')
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)方法能做的類方法也可以做,反之亦然
class Person:
#類的字段又厉,存儲(chǔ)人類的數(shù)量
number = 100
@classmethod
def show_number(cls):
print('人類的數(shù)量是:%d億'%cls.number)
@staticmethod
def show_number():
print('人類的數(shù)量是:%d億'%Person.nmber)
Person.show_number()