1.編程思想
1)編程思想
面向過程編程 - 以邏輯和算法
面向函數(shù)式編程 - 以函數(shù)為工具
面向?qū)ο缶幊? - 以類和對(duì)象為工具
2)類和對(duì)象
類是擁有相同功能和相同屬性的對(duì)象和集合 - 類是抽象的
對(duì)象是類的實(shí)例 - 對(duì)象是具體的
如果人是類 - 某個(gè)人就是對(duì)象
如果杯子是對(duì)象 - 具體某個(gè)杯子(桌上的杯子)就是對(duì)象
2.類和對(duì)象的聲明
1)類的聲明(定義類)
類就是擁有相同功能(函數(shù))和相同屬性(保存數(shù)據(jù)的變量烘绽,也叫屬性)的集合
a.語法
class 類名:
類的說明文檔
類的內(nèi)容
b.說明
class - 關(guān)鍵字迫悠,固定寫法
類名 - 程序員自己命名
要求:必須是標(biāo)識(shí)符,不能是關(guān)鍵字
規(guī)范:見名知義;駝峰式命名并且首字母大寫(studentName)节吮;不能使用系統(tǒng)提供的函數(shù)名、模塊名或類名
類的說明文檔 - 注釋纷责,主要用來說明類中提供的功能有哪些
類的內(nèi)容 - 主要包含類中的函數(shù)(方法)和屬性
方法:對(duì)象方法哼丈、類方法和靜態(tài)
屬性:類的字段和對(duì)象屬性
class Person:
"""人類:有學(xué)習(xí)边器、吃飯和睡覺三個(gè)功能"""
def study(self):
print('人類在學(xué)習(xí)')
def eat(self, food):
print('人在吃%s' % food)
def sleep(self):
print('人在睡覺')
2)創(chuàng)建對(duì)象
a.語法
類() - 創(chuàng)建指定類對(duì)應(yīng)的對(duì)象
b.說明
類 - 已經(jīng)聲明過的類
p1 = Person() # 創(chuàng)建Person類的對(duì)象
3.對(duì)象方法
1)對(duì)象方法
1.怎么聲明:直接聲明在類中的函數(shù)就是對(duì)象方法
2.特點(diǎn):自帶一個(gè)參數(shù)self训枢;當(dāng)通過對(duì)象去調(diào)用對(duì)象方法的時(shí)候self不用傳參,
因?yàn)橄到y(tǒng)會(huì)自動(dòng)將當(dāng)前對(duì)象傳給self(當(dāng)前對(duì)象:用哪個(gè)對(duì)象調(diào)用的self就是誰)
3.怎么調(diào)用:通過對(duì)象來調(diào)用忘巧,以‘對(duì)象.方法名()’的形式來調(diào)用
class Person:
def eat(self):
print('self:', self)
print('吃')
p1 = Person()
print('p1:', p1)
p1.eat()
p2 = Person()
print('p2:', p2)
p2.eat()
# 注意:從語法來說恒界,類中聲明的函數(shù)都可以用類和對(duì)象調(diào)用,但是實(shí)際開發(fā)的時(shí)候?qū)ο蠓椒ㄖ荒苡脤?duì)象調(diào)用
# Person.eat(12)
4.構(gòu)造方法和init方法
1)構(gòu)造方法
構(gòu)造方法就是用來創(chuàng)建對(duì)象函數(shù)砚嘴;構(gòu)造方法的名字和類名一樣的十酣。
python中的構(gòu)造方法:
a.當(dāng)聲明類的時(shí)候系統(tǒng)會(huì)自動(dòng)創(chuàng)建一個(gè)函數(shù)名和類名同名的構(gòu)造方法。
b.當(dāng)通過對(duì)象方法創(chuàng)建對(duì)象的時(shí)候际长,會(huì)自動(dòng)調(diào)用init方法來對(duì)對(duì)象進(jìn)行初始化操作
2)init方法
init是類中一個(gè)特殊的對(duì)象方法耸采;這個(gè)方法不需要主動(dòng)調(diào)用,用來對(duì)對(duì)象初始化的
3)主要掌握(必須掌握9び)
a.通過構(gòu)造方法創(chuàng)建對(duì)象的時(shí)候虾宇,類中init會(huì)被自動(dòng)調(diào)用
b.類中的init方法可以寫也可以不用寫,如果寫函數(shù)名和參數(shù)self不能動(dòng)如绸,但是可以隨意添加其他函數(shù)
c.如果init方法中有除了self以外的參數(shù)嘱朽,那么創(chuàng)建對(duì)象的時(shí)候需要在構(gòu)造方法中給這些參數(shù)傳參
5.屬性
1)什么是屬性
屬性就是聲明在類中的變量;python中類的屬性分為類的字段和對(duì)象屬性兩種
2)類的字段(不是重點(diǎn))
直接聲明在類的里面怔接,函數(shù)的外面的變量就是類的字段
1)怎么聲明:直接聲明在類中
2)怎么使用:通過類來使用:以‘類.字段’的形式使用
3)什么時(shí)候用:保存的屬性值不會(huì)因?yàn)閷?duì)象不同而不一樣的時(shí)候使用
3)對(duì)象屬性(特別重要)
1)怎么聲明:聲明在init方法中搪泳,以'self.屬性 = 值'的形式聲明
2)怎么使用:通過對(duì)象來使用:以'對(duì)象.屬性'的形式使用
3)什么時(shí)候用:屬性值會(huì)因?yàn)閷?duì)象不同而不一樣的屬性就聲明成對(duì)象屬性
class Person:
# num就是字段
num = 61
def __init__(self, name1, gender='男'):
# name, age, gender就是對(duì)象屬性
self.name = name1
self.age = 18
self.gender = gender
def eat(self):
food = '米飯'
# 練習(xí):給Person類添加一個(gè)學(xué)習(xí)的對(duì)象方法,要求實(shí)現(xiàn)打佣笃辍:‘xxx在學(xué)習(xí)岸军!’
def study(self):
print('%s在學(xué)習(xí)' % self.name)
print(Person.num)
p1 = Person('小明', '女')
print(p1.name, p1.age, p1.gender)
p1.name = '小華'
print(p1.name, p1.age, p1.gender)
p1.study()
6.對(duì)象屬性的增刪改查
1)對(duì)象屬性的增刪改查
class Dog:
def __init__(self, name, color, breed, age=3):
self.name = name
self.age = age
self.color = color
self.breed = breed
dog1 = Dog('大黃', '黃色', '薩摩耶')
1.查 - 獲取對(duì)象屬性的值
a.
對(duì)象.屬性 - 獲取指定對(duì)象指定屬性的值
b.
getattr(對(duì)象,屬性名) - 獲取指定對(duì)象指定屬性的值瓦侮,屬性不存在會(huì)報(bào)錯(cuò)
getattr(對(duì)象艰赞,屬性名,默認(rèn)值) - 獲取指定對(duì)象指定屬性的值,屬性不存在的時(shí)候不會(huì)報(bào)錯(cuò)而是返回指定的默認(rèn)值
print(dog1.breed)
# print(dog1.gender) # AttributeError: 'Dog' object has no attribute 'gender'
print(getattr(dog1, 'age')) # 3
# attr_name = input('請(qǐng)輸入屬性名:')
# print(getattr(dog1, attr_name))
print(getattr(dog1, 'gender', 'women')) # women
2.增肚吏、改
a.對(duì)象.屬性 = 值 - 當(dāng)屬性存在的時(shí)候猖毫,修改指定屬性對(duì)應(yīng)的值;當(dāng)屬性不存在的時(shí)候须喂,給對(duì)象添加屬性
b.setattr(對(duì)象吁断,屬性名,值) - 當(dāng)屬性存在的時(shí)候坞生,修改指定屬性對(duì)應(yīng)的值仔役;當(dāng)屬性不存在的時(shí)候,給對(duì)象添加屬性
dog1.name = '旺財(cái)'
print(dog1.name)
dog1.gender = 'man'
print(dog1.gender)
setattr(dog1, 'age', 12)
print(getattr(dog1, 'age'))
setattr(dog1, 'weight', 10)
print(getattr(dog1, 'weight'))
3.刪 - 刪除屬性
a.del 對(duì)象.屬性 - 刪除對(duì)象中指定的屬性
b.delattr(對(duì)象是己,屬性名) - 刪除對(duì)象中指定的屬性
del dog1.name
# print(dog1.name) # AttributeError: 'Dog' object has no attribute 'name'
delattr(dog1, 'color')
# print(dog1.color) # AttributeError: 'Dog' object has no attribute 'color'
7.內(nèi)置類屬性
1)內(nèi)置類屬性
創(chuàng)建類的時(shí)候又兵,系統(tǒng)自動(dòng)添加的屬性就是內(nèi)置類屬性
2)常見的內(nèi)置類屬性
class Dog:
"""類的說明文檔:狗類"""
num = 100
def __init__(self, name, age=1, gender='man'):
self.name = name
self.age = age
self.gender = gender
def eat(self, food: str):
print('%s在吃%s' % (self.name, food))
# 定制當(dāng)前類的對(duì)象的打印
# def __str__(self):
# return '<%s>' % str(self.__dict__)[1: -1]
def __repr__(self):
return '<%s>' % str(self.__dict__)[1: -1]
dog1 = Dog('大黃')
1.name
字段
類.name - 獲取當(dāng)前類的類名
print('一只狗的對(duì)象是%s類型' % Dog.__name__)
2.doc
類.doc - 獲取類的說明文檔
print(Dog.__doc__)
print(int.__doc__)
3.class
對(duì)象.class - 獲取指定對(duì)象對(duì)應(yīng)的類(和type的功能一樣)
print(dog1.__class__)
print(type(dog1))
4.dict
類.dict -獲取指定類中所有的字段和對(duì)應(yīng)的值,以字典的形式返回(了解)
對(duì)象.dict - 獲取對(duì)象所有的屬性和對(duì)應(yīng)的值卒废,以字典的形式返回(掌握)
print(Dog.__dict__)
print(dog1.__dict__)
# 應(yīng)用一:定制對(duì)象的打印效果
dog2 = Dog('小黃', 2)
print(dog1)
print(dog2)
dogs = [dog1, dog2]
print(dogs)
# 應(yīng)用二:將對(duì)象轉(zhuǎn)換成字典
dict1 = dog2.__dict__
print(dict1)
# 將字典轉(zhuǎn)換成對(duì)象
class Dog2:
def __init__(self, dic1):
for key in dic1:
setattr(self, key, dic1[key])
dog11 = Dog2(dict1)
print(dog11)
5.module
類.module - 獲取指定類所在的模塊的模塊名
print(int.__module__)
print(bool.__module__)
print(Dog2.__module__) # __main__
6.bases
類.bases - 獲取當(dāng)前類的父類
object - 是基類
print(Dog.__bases__)
8.slots魔法
1)slots - 約束當(dāng)前類的對(duì)象能夠擁有哪些屬性
如果在類中給slots賦值:a.賦值后沛厨,slots對(duì)應(yīng)的元組中的元素就是當(dāng)前類的對(duì)象能夠擁有的所有屬性
class Person:
__slots__ = ('name', 'age', 'gender')
def __init__(self, name, age=12):
self.name = name
self.age = age
p1 = Person('小明')
# p1.name1 = '小紅' # AttributeError: 'Person' object has no attribute 'name1'
p1.gender = 'man'
print(p1.gender)
# 注意:如果類中設(shè)置了__slots__的值,那么這個(gè)類的對(duì)象就不能使用__dict__
# print(p1.__dict__) # AttributeError: 'Person' object has no attribute '__dict__'
9.類方法和靜態(tài)方法
1)類中的方法
類中的方法有三種:對(duì)象方法摔认、類方法逆皮、靜態(tài)方法
a.對(duì)象方法
怎么聲明:直接聲明在類中
怎么調(diào)用:用對(duì)象來調(diào)用
特點(diǎn):自帶參數(shù)self,self在調(diào)用的時(shí)候不用傳參,系統(tǒng)會(huì)自動(dòng)將當(dāng)前對(duì)象傳給它
什么時(shí)候用:(實(shí)現(xiàn)函數(shù)功能需要對(duì)象) 實(shí)現(xiàn)函數(shù)的功能需要用到對(duì)象屬性就使用對(duì)象方法
b.類方法
怎么聲明:在裝飾器@classmethod后面聲明函數(shù)
怎么調(diào)用:用類來調(diào)用
特點(diǎn):有默認(rèn)參數(shù)cls,cls在調(diào)用的時(shí)候不用傳參参袱,系統(tǒng)會(huì)自動(dòng)將當(dāng)前類傳給它电谣。(類能做的cls都可以做)
什么時(shí)候用:(實(shí)現(xiàn)函數(shù)功能不需要對(duì)象的前提下,需要類)
c.靜態(tài)方法
怎么聲明:在裝飾器@staticmethod后面聲明函數(shù)
怎么調(diào)用:用類來調(diào)用
特點(diǎn):沒有任何默認(rèn)參數(shù)
什么時(shí)候用:(實(shí)現(xiàn)函數(shù)的功能既不需要類也不需要對(duì)象)
class Student:
num = 10
def __init__(self, name, score):
self.name = name
self.study_id = '001'
self.score = score
def func0(self):
print('這是一個(gè)對(duì)象方法')
@classmethod
def func1(cls):
print(cls)
# 類能做的cls也能做
stu2 = cls('小花', 89)
print(stu2)
print(cls.num)
print('這是一個(gè)類方法')
cls.func2()
@staticmethod
def func2():
print('靜態(tài)方法')
stu1 = Student('小明', 90)
stu1.func0()
Student.func1()
print(Student)
Student.func2()