類和對(duì)象
1.什么是類,什么是對(duì)象
類就是擁有相同功能和相同屬性的對(duì)象的集合 - 類是抽象的
對(duì)象就是類的實(shí)例 - 對(duì)象是具體的
如果說(shuō)人是一個(gè)類,李白就是一個(gè)對(duì)象,李牧是另一個(gè)對(duì)象
如果說(shuō)整數(shù)是一個(gè)類,100是一個(gè)對(duì)象,2是另外一個(gè)對(duì)象
2.類的聲明
1)語(yǔ)法
class 類名:
類的內(nèi)容
2)說(shuō)明
class - 關(guān)鍵字
類命 - 程序員自己命名:是標(biāo)識(shí)符但不能是關(guān)鍵字(要求)
采用駝峰式命名(studentName, 不要求首個(gè)字母大寫),并且首字母大寫(StudentName)
見(jiàn)名知義
類的內(nèi)容 - 包含類的說(shuō)明文檔,類中的函數(shù)(相同功能),類的屬性(相同屬性)
3.創(chuàng)建對(duì)象
1)語(yǔ)法
對(duì)象 = 類()
對(duì)象方法
1.類中的函數(shù)
聲明在類中的函數(shù)又叫方法,類中的方法分為三種:對(duì)象方法、類方法、靜態(tài)方法
1)對(duì)象方法
直接聲明在類中函數(shù),自帶一個(gè)self參數(shù)。
對(duì)象方法需要通過(guò)'對(duì)象.函數(shù)名()'的方式調(diào)用
通過(guò)對(duì)象調(diào)用對(duì)象方法的時(shí)候,self不需要傳參;系統(tǒng)會(huì)自動(dòng)將當(dāng)前對(duì)象傳給self(誰(shuí)調(diào)用指向誰(shuí))
init方法
什么是init方法
init是類中的一個(gè)魔法方法,在創(chuàng)建對(duì)象的時(shí)候會(huì)被自動(dòng)調(diào)用
類中的屬性
1.類中的屬性:對(duì)象屬性、字段
1)字段
a.怎么聲明:聲明在類的里面,函數(shù)的外面的變量,就是字段
b.怎么使用:通過(guò)類.字段的方式使用
c.什么時(shí)候用:屬性值不會(huì)因?yàn)閷?duì)象不同而不一樣,這樣的屬性就聲明成類的字段
2)對(duì)象屬性
a.怎么聲明:以'self.屬性名=值'的方式聲明init方法中
b.怎么使用:通過(guò)'對(duì)象.屬性名'的方式去使用
c.什么時(shí)候用:屬性值會(huì)因?yàn)閷?duì)象不同而不一樣,這樣的屬性就聲明為對(duì)象屬性
class Person:
# num就是類的字段
num = 61
# print(num) NameError: name 'num' is not defined
print(Person.num) # 61
Person.num = 100
print(Person.num) # 重新賦值 100
print('對(duì)象屬性===============')
class Person:
# num就是類的字段
num = 61
def __init__(self):
# 這兒的name,age和gender就是Person類的對(duì)象屬性
self.name = ''
self.aeg = 0
self.gender = '男'
對(duì)象屬性的增刪改查
1.對(duì)象屬性
python中對(duì)象屬性支持增刪改查操作
class Person:
def __init__(self, name, age=0, gender='男'):
self.name = name
self.age = age
self.gender = gender
p1 = Person('小明', 18)
p2 = Person('小花', 20 ,'女')
2.查 - 獲取對(duì)象屬性的值
1)對(duì)象.屬性 - 獲取對(duì)象指定的值,如果不存在,報(bào)錯(cuò)
2)getattr(對(duì)象,屬性名) - 獲取對(duì)象指定的值,如果不存在,報(bào)錯(cuò)
getattr(對(duì)象,屬性名, 默認(rèn)值) - 獲取對(duì)象指定屬性的值,如果屬性不存在,不會(huì)報(bào)錯(cuò)而是返回默認(rèn)值
# 1)對(duì)象.屬性
print(p1.name) # 小明
# print(p1.name33) # AttributeError: 'Person' object has no attribute 'name33'
# 2)getattr(對(duì)象,屬性名)
print(getattr(p1, 'name')) # 小明
# print(getattr(p1, 'name22')) # AttributeError: 'Person' object has no attribute 'name22'
print(getattr(p1, 'name22', '001')) # 001
# value = input('請(qǐng)輸入要獲取的屬性名:')
# print(getattr(p1, value))
3.增/改 - 給對(duì)象添加屬性/修改對(duì)象屬性的值
1)對(duì)象.屬性 = 值 - 當(dāng)屬性不存在就給對(duì)象添加屬性;如果屬性存在就修改屬性的值
2)setattr(對(duì)象,屬性名,值) - 當(dāng)屬性不存在就給對(duì)象添加屬性;如果屬性存在就修改屬性的值
4.刪 - 刪除對(duì)象屬性
1)del 對(duì)象.屬性
2)delattr(對(duì)象, 屬性名)
內(nèi)置類屬性
什么是內(nèi)置類屬性
創(chuàng)建類的時(shí)候,系統(tǒng)自動(dòng)為這個(gè)類提供的屬性
class Person:
"""說(shuō)明文檔:人類"""
num = 61
def __init__(self, name, age=0, gender='女'):
self.name = name
self.age = age
self.gender = gender
def eat(self, food):
print('%s在吃%s' % (self.name, food))
1.name:
類的字段,獲取類的名字
print(Person.__name__) # 'Person' 字符串、
print(Person) # <class '__main__.Person'> 類型
2.doc
類的字段,獲取類的說(shuō)明文檔
print(Person.__doc__) # 說(shuō)明文檔:人類
# print(int.__doc__) # 打印出int類的說(shuō)明文檔
3__class__
對(duì)象屬性,獲取對(duì)象對(duì)應(yīng)的類
c1 = p1.__class__
print(c1) # <class '__main__.Person'>
p2 = c1('小花')
print(p1, p2) # <'name': 'Tom', 'age': 18, 'gender': '男'> <'name': '小花', 'age': 0, 'gender': '女'>
print(c1.num, Person.num) # 61 61
4.dict
1)類的字段,獲取類中的字段(用得少)
2)對(duì)象屬性,獲取對(duì)象的所有屬性和其對(duì)應(yīng)的值,以字典的形式返回(用得多)
注意:如果給類slots屬性賦了值,那么這個(gè)類的對(duì)象就不能使用dict去獲取所有屬性
print(Person.__dict__)
print(p1.__dict__) # {'name': 'Tom', 'age': 18, 'gender': '男'}
5.module
類的字段,獲取類所在的模塊(類是在哪個(gè)py文件中聲明的),返回的是模塊名
print(Person.__module__) # __main__ 表明類在當(dāng)前模塊聲明
print(int.__module__) # builtins
6.bases
類的字段,獲取當(dāng)前類的父類
print(Person.__bases__) # (<class 'object'>,) 是個(gè)元組 所有類的基類(祖先)都是object