面向?qū)ο蠡A(chǔ)
1認(rèn)識面向?qū)ο?/h2>
1.1什么是類和對象
類是擁有共同屬性和方法的封裝 是抽象,而且相同的屬性的值是不確定的
對象是具體的,而且對應(yīng)的屬性是確定的。比如說如果人是一個(gè)類,隔壁老王就是人的對象。
1.2面向?qū)ο缶幊?/h3>
面向過程編程:一步一步的寫代碼實(shí)現(xiàn)功能 -->工具:邏輯和算法
函數(shù)式編程:面對問題考慮有沒有擁有功能的函數(shù) -->工具:函數(shù)
面向?qū)ο缶幊蹋好鎸栴}考慮有沒有相應(yīng)的對象來解決問題 -->工具:類和對象
2.類的聲明
格式: class 類名(父類):
? 屬性
? 方法
說明:class是python中聲明類的關(guān)鍵字。類名是標(biāo)識符,首字母大寫,駝峰式命名。
屬性是對象屬性和類的字段 用來保存數(shù)據(jù) 方法是聲明在類中的函數(shù) 實(shí)現(xiàn)功能
1.聲明類Person
聲明兩個(gè)對象方法,需要使用兩個(gè)對象來調(diào)動(dòng) #對象方法默認(rèn)都有一個(gè)參數(shù)self,在調(diào)用方法的時(shí)候,這個(gè)參數(shù)不用傳參,系統(tǒng)會(huì)自動(dòng)給他傳參 #誰來調(diào)用這個(gè)方法,self就是誰
class Person():
'''類的聲明:人類'''
pass
def eat(self):
print('吃飯')
def sleep(self):
print('睡覺')
2.聲明對象
通過類的構(gòu)造方法去創(chuàng)建對象(名字和類名同名的方法就是構(gòu)造方法,自動(dòng)生成)
對象名 = 類名()
類的對象可以通過.語法可以使用類中聲明的方法和屬性
對象.方法名() 對象.屬性名
if __name__ == '__main__':
people1 = Person()
people1.eat()
people2 = Person()
people2.sleep()
3.對象的屬性
對象屬性的聲明
class 類名:
def __init__(self):
self.屬性名 = 初值
self.屬性名2 = 初值
init方法的說明:init是系統(tǒng)自帶的一個(gè)方法,這個(gè)方法不能直接調(diào)用,而是通過類創(chuàng)建對象的時(shí)候系統(tǒng)會(huì)自動(dòng)調(diào)用的方法。init的作用是對對象的屬性的初始化。通過構(gòu)造方法創(chuàng)建對象的時(shí)候,要保證,init方法中除了self以外,其他的參數(shù)都必須有值
4.對象事件的增刪查改
class Stu():
'''學(xué)生類'''
def __init__(self,name,sex,age):
self.name = name
self.sex = sex
self.age = age
def study(self):
print(self.name+'正在學(xué)習(xí)')
if __name__ == '__main__':
dog1 = Dog(3,'yellow')
#1.查
#方法一:對象.屬性
print(dog1.age,dog1.color)
#方法二:對象.getattr(對象名,屬性)
#對象.__getattribute__(屬性)
print(dog1.__getattribute__('age'))
print(getattr(dog1,'age'))
#設(shè)置一個(gè)默認(rèn)值,如果屬性不存在,返回默認(rèn)值
print(getattr(dog1,'abc','無名氏'))
#2.修改
#方法1 對象.屬性名
dog1.age = 5
dog1.color = 'red'
print(dog1.age,dog1.color)
#方法2 對象.__setattr__(屬性名,新值) 或者 setattr(對象名,屬性,新值)
dog1.__setattr__('color','black')
print(dog1.color)
setattr(dog1,'color','blue')
print(dog1.color)
#3.增加
#方法1:對象.屬性 = 值(屬性不存在)
# 注意:屬性是添加給對象的,而不是類的
dog1.name = 'lili'
print(dog1.name)
#方法2 對象.__setattr__(新屬性名,新值) 或者 setattr(對象名,屬性,新值)
dog1.__setattr__('type','哈士奇')
print(dog1.type)
setattr(dog1,'sex','公')
print(dog1.sex)
#4.刪除(刪除對象的屬性)
'''
方法1:
del 對象.屬性
注意:刪除的是刪的某個(gè)具體對象的屬性,不會(huì)影響這個(gè)類的其他對象
'''
del dog1.age
'''
方法二:對象名.__delattr__(屬性) 或者 delattr(對象,屬性)
'''
delattr(dog1,'age')
stu1 =Stu('小明',18,'男')
#三種方式獲取姓名,性別,年齡
print(stu1.name,stu1.sex,stu1.age)
print(stu1.__getattribute__('name'))
print(stu1.__getattribute__('sex'))
print(stu1.__getattribute__('age'))
print(getattr(stu1,'name'))
print(getattr(stu1, 'sex'))
print(getattr(stu1, 'age'))
stu1.tel = 12345
print(stu1.tel)
stu1.age = 20
print(stu1.age)
del stu1.sex
print(getattr(stu1,'sex','不存在sex這個(gè)屬性'))
stu1.study()
5.slots魔法
slots魔法的功能是約束類中的對象的屬性
str是自定義print(對象)的返回值,方便調(diào)試
# @Author : Fizzyi
class Person():
#__slots__ 的功能:約束類中的對象的屬性
__slots__ = ('name','age','sex')
def __init__(self,name,age,sex):
self.name = name
self.age = age
self.sex = sex
def __str__(self):
#自定義print(對象)的返回值,方便調(diào)試
return '人類'
if __name__ == '__main__':
p1 = Person('小王',20,'男')
p1.name ='老王'
print(p1)
6.類中的方法
屬性:對象的屬性(屬性),類的屬性(字段)
對象屬性:屬于對象的,不同的對象對應(yīng)的值可能不一樣,對象屬性通過對象來使用
類的字段:聲明在類中,函數(shù)的外面。類的屬性屬于類,類的字段通過類來使用
方法:對象方法(方法),類方法,靜態(tài)方法
對象方法自帶一個(gè)self參數(shù),一般通過對象去調(diào)用
類方法:1使用@classmethod進(jìn)行修飾
? 2自帶一個(gè)cls參數(shù),并且參數(shù)不用傳參
? 3誰調(diào)用這個(gè)方法,cls就指向誰。類方法要通過類來調(diào)用
靜態(tài)方法:1使用@staticmethod進(jìn)行修飾
? 2沒有默認(rèn)參數(shù)
? 3靜態(tài)方法通過類來調(diào)用
怎么選擇對象方法,類方法,靜態(tài)方法
if:
? 如果實(shí)現(xiàn)函數(shù)的功能需要使用對象的屬性,就聲明成對象方法
Elif:
? 如果實(shí)現(xiàn)函數(shù)的功能需要使用類的字段或者調(diào)用類的方法,就聲明成類方法
Else:
? 如果使用函數(shù)功能既不需要對象的屬性也不需要類的字段就聲明成靜態(tài)方法
class Myperson():
#number是類的字段
number = 0
def __init__(self,name,age):
#name,age對象屬性
self.name = name
self.age = age
#eat方法是對象方法
def eat(self,food):
print(self.name+'吃'+food)
#聲明類方法,@classmethod
@classmethod
def hurt_earth(cls):
#cls指向的是調(diào)用這個(gè)方法的類,使用cls可以當(dāng)成類來使用。
pt = cls('張勝男',20) #可以使用cls創(chuàng)建對象
print(pt.name)
print(cls.number)
print('人類破壞環(huán)境')
#protect_earth()靜態(tài)方法
@staticmethod
def protect_earth():
print('保護(hù)環(huán)境')
if __name__ == '__main__':
#1.類的字段要用類來使用
print(Myperson.number)
#2.對象的屬性要通過對象來使用
print(Myperson('小敏',20).name)
#3.對象的方法用對象調(diào)用
Myperson('小名',20).eat('西瓜')
#4.類方法通過類來調(diào)用
Myperson.hurt_earth()
#5.靜態(tài)方法通過類來調(diào)用
Myperson.protect_earth()