===編程思想===
1.面向過程編程 - 遇到問題直接將邏輯轉(zhuǎn)換成代碼; 邏輯思維,算法
2.函數(shù)式編程 - 遇到問題就想找一個豌习、寫一個擁有相應(yīng)功能的函數(shù); 以函數(shù)作用工具
3.面向?qū)ο缶幊?- 遇到問題就考慮可以不可以有一個類來給我提供相應(yīng)的功能和數(shù)據(jù); 以類和對象為工具
??python既支持函數(shù)式編程也支持面向?qū)ο缶幊?/p>
===認識類和對象===
1.什么是類苏潜,什么是對象
??類就是擁有相同功能和相同屬性的對象的集合; 類是抽象的
??對象就是類的實例; 對象是具體的
2.類的聲明
??類中的內(nèi)容包含功能(函數(shù))和屬性(變量/屬性)
??a.語法
??class 類名:
????類的內(nèi)容
??b.說明
??class - python聲明類的關(guān)鍵字
??類名 - 要求:標識符, 不能是關(guān)鍵字
? ? ?? 規(guī)范:駝峰式命名(通過首字母大寫來區(qū)分不同的單詞); 第一個字母要大寫
??: - 固定寫法
??類的內(nèi)容 - 包含類的方法银萍、屬性和說明文檔
? ? ? ???方法就是聲明在類中的函數(shù)
? ?? ?? ?屬性就是聲明在類中的變量
3.對象的聲明
??語法:
??類名() - 創(chuàng)建指定的類的對象并且返回
===對象方法===
??class 類名:
????類中的屬性
????類中的方法
1.類中的方法
??聲明在類中的函數(shù)就是方法
??類中的方法包括: 對象方法(實例方法), 類方法, 靜態(tài)方法
2.對象方法:
a.什么是對象方法
??直接聲明在類中的方法就是對象方法
??有默認參數(shù)self
??通過'對象.方法()'的方式來調(diào)用(對象方法要通過對象來調(diào)用)
b.參數(shù)self
??當我們通過對象調(diào)用對象方法的時候,self不需要傳參;因為系統(tǒng)會自動將當前對象傳遞給self恤左。
??當前對象:調(diào)用當前方法的對象(誰調(diào)用對象方法self就是誰)
??注意:當前類的對象能做的事情self都能做
===init方法和構(gòu)造方法===
1.init方法: init
??init方法是類中的一個特殊的對象方法,專門用來對象創(chuàng)建的對象進行初始化贴唇。
??當通過類創(chuàng)建對象的時候搀绣,系統(tǒng)就會自動調(diào)用init方法
2.構(gòu)造方法
a.什么是構(gòu)造方法
??函數(shù)名和類名一樣的函數(shù)就是構(gòu)造方法, 專門用來創(chuàng)建對象戳气。
??python中聲明類的時候系統(tǒng)會自動創(chuàng)建這個類對應(yīng)的構(gòu)造方法链患。
b.構(gòu)造方法的執(zhí)行過程
??當我們構(gòu)造方法的時候內(nèi)部會先在內(nèi)存中開辟空間保存對象;然后用創(chuàng)建的這個對象去調(diào)用inin方法,用來對對象進行初始化;
??init方法調(diào)用結(jié)束后,返回對象.
??def Person(*args, *kwargs):
????對象 = 創(chuàng)建對象
????對象.init(args, **kwargs)
????return 對象
??注意: 如果類的init方法除了self以外還有其他參數(shù)瓶您,那么我們在創(chuàng)建對象的時候需要通過給構(gòu)造方法來給init方法傳參
===對象屬性===
1.什么是對象屬性
??類中的屬性分為類的字段和對象屬性
a.對象屬性 - 屬性的值會因為對象不同而不一樣麻捻,這種屬性就應(yīng)該聲明為對象屬性
??聲明在init方法中 - 位置
??以'self.屬性名 = 值'的方式來聲明(這兒的屬性就是對象屬性) - 方式
??通過'對象.屬性'的方式來使用 - 使用
b.類的字段 - 屬性的值不會因為對象不同而不同,這種屬性就聲明成類的字段
??直接聲明類的里面呀袱,函數(shù)的外面的變量就是類的字段
??以'字段名 = 值'
??通過'類.字段'的方式來使用
===對象屬性的增刪改查===
??python中對象的屬性支持增刪改查
# 屬性的增刪改查
class Person:
def __init__(self, name='', age=0, sex='女'):
self.name = name
self.age = age
self.sex = sex
p1 = Person('小花')
p2 = Person('小紅')
1.查(獲取對象屬性)
??對象.屬性 - 獲取指定對象指定屬性值;當屬性不存在的時候會報錯
??getattr(對象, 屬性名:str, 默認值) - 獲取指定對象指定屬性值;當屬性不存在的時候如果給默認值賦了值贸毕,程序不會報錯,并且將默認值作為結(jié)果
print('==============查===================')
print(p1.name)
# 屬性不確定的時候可以使用getattr
attr = input('屬性:')
print(getattr(p1, attr))
print(getattr(p1, 'name', None))
print(getattr(p1, 'name1', None))
2.增/改
??對象.屬性 = 值 - 當屬性存在的是修改屬性的值夜赵;屬性不存在的時候添加屬性
??setattr(對象, 屬性名, 值) - 當屬性存在的是修改屬性的值明棍;屬性不存在的時候添加屬性
print('==============增/改===================')
# 修改屬性
setattr(p1, 'age', 18)
print(p1.age)
# 添加屬性
setattr(p1, 'weight', 200)
print(p1.weight)
3.刪
??del 對象.屬性
??delattr(對象, 屬性名)
print('==============刪=================')
del p1.sex
# print(p1.sex) # AttributeError: 'Person' object has no attribute 'sex'
delattr(p1, 'age')
# print(p1.age) # AttributeError: 'Person' object has no attribute 'age'
# 注意:對象屬性的操作,只針對操作的那一個對象寇僧,不會影響其他對象
print(p1.height)
# print(p2.height) # AttributeError: 'Person' object has no attribute 'height'
print(p2.age)
===內(nèi)置屬性===
??內(nèi)置屬性指的是我們創(chuàng)建類的時候系統(tǒng)自動給我們添加的屬性(其實是通過繼承獲取到的)
class Person:
"""說明文檔:人類"""
# 類的字段
num = 61
# __slots__ = ('name', 'age', 'sex')
# 對象屬性
def __init__(self, name='', age=0, sex='男'):
self.name = name
self.age = age
self.sex = sex
def eat(self, food):
print('%s在吃%s' % (self.name, food))
# 定制對象的打印格式(當我們通過print打印一個對象的時候击蹲,
# 實質(zhì)就是打印對象調(diào)用__repr__函數(shù)的返回值)
# 這個函數(shù)的返回值必須是字符串
def __repr__(self):
return '<' + str(self.__dict__)[1:-1] + ' at ' + hex(id(self)) + '>'
p1 = Person('小明', 18)
print(p1) # print(p1.__repr__())
persons = [Person('p1', 12), Person('p2', 18, '女')]
print(persons)
# 1. 類.__name__ - 獲取的名字(字符串)
print(Person)
class_name = Person.__name__
print(Person, class_name)
# 值是一個字符串,可以當成字符串來用
print(class_name.upper())
# 2. 對象.__class__ - 獲取對象對應(yīng)的類(結(jié)果是類)
# 獲取對象p1的類
my_class = p1.__class__
print(my_class)
# 可以將my_class當成類來使用
p2 = my_class('小花')
print(my_class.num)
# 3. 類.__doc__ - 獲取類的說明文檔(字符串)
print(Person.__doc__)
print(int.__doc__)
# 獲取對象p1對應(yīng)的類的說明文檔
print(p1.__class__.__doc__)
# 4.對象.__dict__ - 將對象轉(zhuǎn)換成字典婉宰,將屬性和值作為字典的鍵值對(字典)
# 注意:當給__slots__屬性賦值后,對象的__dict__屬性就不能使用
print(p1.__dict__)
# 5.類.__module__ - 獲取當前類所在的模塊的模塊名
print(Person.__module__)
# 6.類.__bases__ - 獲取當前類的父類(元祖)
print(Person.__bases__)