一、編程思想
1.面向過程
做法:遇到問題直接將(邏輯和算法)轉(zhuǎn)換為代碼
使用工具:邏輯和算法
2.面向函數(shù)式編程
做法:遇到問題就想找一個养篓、寫一個相應(yīng)功能的函數(shù)
使用工具:函數(shù)
3.面向?qū)ο?/strong>
做法:遇到問題就考慮可不可以有一個類來提供相應(yīng)的功能和數(shù)據(jù)
使用工具:類和對象
類中的屬性 - 對數(shù)據(jù)的封裝
類中的函數(shù) - 對功能的封裝
二、類和對象基礎(chǔ)
1.類和對象的概念
a.什么是類:
概念:擁有相同功能和相同屬性的對象的集合(抽象)
b.什么是對象
概念:類的實例(具體)
2.類的聲明
內(nèi)容:功能(函數(shù))和屬性(變量/屬性)
a.語法
class 類名(父類):
?類的內(nèi)容
b.說明
class: 聲明類的關(guān)鍵字
類名:標(biāo)識符洗显,并且不能是關(guān)鍵字
規(guī)范:采用大駝峰式命名
::規(guī)定寫法
類的內(nèi)容:累的方法拧烦、屬性和說明文檔
方法:聲明在類中的函數(shù)
屬性:聲明在類中的變量
3.如何聲明對象
方法:類名()
說明:創(chuàng)建指定類的對象并且返回
注意:同一個類可以創(chuàng)建多個對象
示例:
# 聲明一個人類
class Person:
"""類的說明文檔"""
num = 61 # 類中的屬性
# 類中的方法
def eat(self):
print('人在吃飯V位健!')
# 創(chuàng)建Person類的對象茉帅;p1就是對象
p1 = Person()
print(p1)
# 同一個類可以創(chuàng)建多個對象
p2 = Person()
print(p2)
三叨叙、對象方法
聲明類的偽代碼
class 類名:
? 類中的屬性
? 類中的方法
1.什么是類中的方法
聲明在類中的函數(shù)就是方法
分類:
指導(dǎo)思想:怎么聲明,怎么調(diào)用堪澎,特點
a.對象方法:
聲明:直接聲明在類中
特點:有默認(rèn)參數(shù)self,通過對象調(diào)用可以不用傳參
調(diào)用:對象.對象方法名
當(dāng)前對象:調(diào)用當(dāng)前方法的對象(誰調(diào)用對象方法self就是誰)
注意:當(dāng)前類的對象能做的事情擂错,self都能做
b.類方法:
聲明:聲明函數(shù)前加@classmethod
特點:有默認(rèn)參數(shù)cls,通過類調(diào)用時,可以不用傳參
調(diào)用:類名.類方法名
當(dāng)前對象:調(diào)用當(dāng)前方法的類(誰調(diào)用類方法*cls就是誰)
注意:當(dāng)前類能做的事情樱蛤,cls都能做
c.靜態(tài)方法:
聲明:聲明函數(shù)前加@staticmethod
特點:沒有默認(rèn)參數(shù)
調(diào)用:類名.靜態(tài)方法名
實際運用
類中怎么選擇使用哪種方法:
對象方法:實現(xiàn)函數(shù)功能需要使用對象屬性
類方法:
1.不需要使用對象屬性為前提
2.需要使用類的字段
靜態(tài)方法:對象屬性和類的字段皆不需要
class Person:
# 類的字段
num = 23
# 對象方法:用到對象屬性name
def __init__(self):
self.name = '張三'
# 對象屬性和類的字段都有钮呀,選擇對象方法
def func4(self):
# 通過self.name來獲取對象的姓名
print('%s對應(yīng)的對象' % self.name)
# 通過 類名.類的字段 來使用類的字段
print('人類的數(shù)量%d億' % Person.num)
# 靜態(tài)方法:對象屬性和類的字段都不需要
@staticmethod
def func3():
print('我是靜態(tài)方法')
# 類方法:需要使用類的字段
@classmethod
def func1(cls):
# 類能做的事情,cls都能做
p1 = cls() # 用cls創(chuàng)建對象
print(p1)
cls.num = 100 # 用cls來使用類的字段
print(cls)
print('這是一個類方法')
四昨凡、init方法和構(gòu)造方法
1.init方法:init
定義:類中的一個特殊的對象方法
功能:專門用來對象創(chuàng)建的對象進行初始化
過程:當(dāng)通過類創(chuàng)建對象時爽醋,系統(tǒng)就會自動調(diào)用init方法
2.構(gòu)造方法:
定義:函數(shù)名和類名一樣的函數(shù)
功能:專門用來創(chuàng)建對象
原理:
1.聲明類時,系統(tǒng)自動創(chuàng)建類對應(yīng)的構(gòu)造方法
內(nèi)部如何實現(xiàn)
2.創(chuàng)建對象時便脊,內(nèi)部會先在內(nèi)部開辟空間保存對象蚂四;然后用創(chuàng)建的對象去調(diào)用init方法,用來對對象進行初始化哪痰,init方法結(jié)束后遂赠,返回對象
def Person(*args, *kwargs):
? 對象 = 創(chuàng)建對象
? 對象.init(args, **kwargs)
? return 對象
注意:如果類的init方法除了self以外,還有其他參數(shù)晌杰,那么我們在創(chuàng)建對象的時候跷睦,需要通過給構(gòu)造方法傳參,來間接給init方法參數(shù)賦值
魔法方法:類中以__開頭并且以__結(jié)尾的方法
特點:創(chuàng)建對象時肋演,無需主動調(diào)用抑诸,系統(tǒng)會自動調(diào)用
# =========構(gòu)造方法和init方法的原理=========
# 構(gòu)造方法的偽代碼
def my_init(x, y, z):
print(x, y, z)
print('my_init')
def my_Dog(*args, **kwargs):
my_init(*args, **kwargs)
my_Dog(10, 29, 39)
五、類中屬性
分類:類的字段和對象屬性
a.對象屬性:
特點:屬性的值會因為對象不同而不同
聲明:init對象方法中
方式:self.屬性 = 值(這里屬性就是對象屬性)
調(diào)用:對象.屬性
b.類的字段
特點:屬性的值不會因為對象的不同而不同
聲明:在類中惋啃,但在函數(shù)外
方式:類的字段名 = 值
調(diào)用:類名.類的字段名
class Person:
# 類的字段
num = 33
# 在init方法中聲明對象屬性
def __init__(self, name1='', age1=0):
self.name = name1
self.age = age1
對象屬性的增刪改查
1.查(獲取對象屬性)
方法一:
對象.屬性
功能:獲取指定對象的指定屬性值;屬性不存在報錯
錯誤類型:AttributeError 屬性錯誤
class Person:
def __init__(self, name='', age=0, sex='女'):
self.name = name
self.age = age
self.sex = sex
print(p1.name)
# print(p1.name1) # AttributeError 屬性錯誤
方法二:
getattr(對象哼鬓,屬性名)
功能:獲取指定對象的指定屬性值;
特點:屬性不存在,給默認(rèn)值賦值边灭,不會報錯异希,并且將默認(rèn)值作為結(jié)果返回
應(yīng)用場景:不確定屬性值是否存在時使用
class Person:
def __init__(self, name='', age=0, sex='女'):
self.name = name
self.age = age
self.sex = sex
# 屬性不確定,可以使用getattr
# attr = input('屬性:')
# print(getattr(p1, attr))
print(getattr(p1, 'name', None))
print(getattr(p1, 'name1', None))
2.增(添加屬性)/ 改(修改屬性的值)
方法一:
對象.屬性 = 值
功能:
1.屬性存在,修改屬性值
2.屬性不存在称簿,添加屬性
方法二:
setattr(對象扣癣,屬性名,值)
功能:
1.屬性存在憨降,修改屬性值
2.屬性不存在父虑,添加屬性
class Person:
def __init__(self, name='', age=0, sex='女'):
self.name = name
self.age = age
self.sex = sex
# 修改屬性
p1.name = '啊帥'
print(p1.name)
# 添加屬性
p1.height = 180
print(p1.height)
# 修改屬性
setattr(p1, 'age', 300)
print(p1.age)
# 添加屬性
setattr(p1, 'weight', 200)
print(p1.weight)
3.刪(刪除屬性)
方法一:
del 對象.屬性
功能:刪除對象屬性
方法二:
delattr(對象,屬性名)
輸入:2個授药,對象士嚎、屬性名
功能:刪除對象屬性
class Person:
def __init__(self, name='', age=0, sex='女'):
self.name = name
self.age = age
self.sex = sex
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'
注意:對象屬性的操作只針對于當(dāng)前對象,不會影響其他對象
補充:__slots__魔法方法
功能:約束當(dāng)前對象能夠擁有的屬性個數(shù)
特點:init方法里對象屬性的個數(shù)少于或者等于slots方法的個數(shù)
class Dog:
# __slots__魔法
# 約束當(dāng)前對象最多能擁有的那個屬性
__slots__ = ('name', 'color', 'sex', 'age') # 下邊聲明的屬性比這里少就行
def __init__(self, name= '', color='黑色'):
self.name = name
self.color = color
dog1 = Dog('大話', '黃色')
dog1.name = 'sss'
del dog1.color
六悔叽、內(nèi)置屬性
定義:創(chuàng)建對象時莱衩,系統(tǒng)自動給我們添加的屬性(通過繼承得到)
-
__name__
功能:獲取類的名字
返回值:字符串
調(diào)用:類名.__name__
補充:獲取的字符串可以當(dāng)做字符串來用
class Person:
"""說明文檔:人類"""
num = 62
def __init__(self, name='', age=0, sex='男'):
self.name = name
self.age = age
self.sex = sex
print(Person) # <class '__main__.Person'>
print(Person.__name__, type(Person.__name__)) # Person <class 'str'>
# 值是一個字符串,可以當(dāng)做字符串來用
print(Person.__name__.upper()) # PERSON
-
__class__
功能:獲取對象對應(yīng)的類
返回值:類名
調(diào)用:對象.__class__
補充:可以將獲取的類名當(dāng)做類來用
class Person:
"""說明文檔:人類"""
num = 62
def __init__(self, name='', age=0, sex='男'):
self.name = name
self.age = age
self.sex = sex
p1 = Person()
my_class = p1.__class__
print(my_class) # <class '__main__.Person'>
# 可以將my_class當(dāng)做類使用
p2 = my_class('笑素數(shù)')
print(p2.num) # 62
-
__doc__
功能:獲取類的說明文檔
返回值:字符串
調(diào)用:類名.__doc__
class Person:
"""說明文檔:人類"""
num = 62
def __init__(self, name='', age=0, sex='男'):
self.name = name
self.age = age
self.sex = sex
print(Person.__doc__) # 說明文檔:人類
# 獲取p1對應(yīng)的說明文檔
p1 = Person()
print(p1.__class__.__doc__) # 說明文檔:人類
- __dict__
功能:將對象屬性轉(zhuǎn)化為字典娇澎,屬性作為key笨蚁,值作為value
返回值:字典
調(diào)用:對象.__dict__
坑:當(dāng)給slots屬性賦值后,對象的dict屬性就不能使用
class Person:
"""說明文檔:人類"""
num = 62
def __init__(self, name='', age=0, sex='男'):
self.name = name
self.age = age
self.sex = sex
p1 = Person()
print(p1.__dict__) # {'name': '', 'age': 0, 'sex': '男'}
-
__bases__
功能:獲取當(dāng)前類的父類
返回值:元祖
調(diào)用:類名.__bases__
class Person:
"""說明文檔:人類"""
num = 62
def __init__(self, name='', age=0, sex='男'):
self.name = name
self.age = age
self.sex = sex
print(Person.__bases__) # (<class 'object'>,)
補充:__repr__
原理:當(dāng)通過print打印一個對象的時候趟庄,實質(zhì)是打印對象調(diào)用__repr__函數(shù)的返回值
功能:定制對象的打印格式
返回值:字符串
聲明:類中的對象魔法方法
class Person:
"""說明文檔:人類"""
num = 62
def __init__(self, name='', age=0, sex='男'):
self.name = name
self.age = age
self.sex = sex
def __repr__(self):
# 系統(tǒng)默認(rèn)的打印格式
return '<%s.%s object at %s>' % (self.__class__.__module__, self.__class__.__name__, hex(id(self)))
return str(self.__dict__)[1:-1] + 'at' + hex(id(self)) # 定制