什么是類椿每,什么是對(duì)象
-
什么是類奕纫,什么是對(duì)象
類就是擁有相同功能和相同屬性的對(duì)象的集合;類是抽象的對(duì)象就是類的實(shí)例;對(duì)象是具體的
人是類, 郭銳就是人類的對(duì)象
-
類的聲明
類中的內(nèi)容包含功能(函數(shù))和屬性(變量/屬性)- 語(yǔ)法
class 類名:
? 類的內(nèi)容 - 說(shuō)明
class - python聲明類的關(guān)鍵字
類名 - 要求:標(biāo)識(shí)符疾嗅、不能是關(guān)鍵字
? 規(guī)范:駝峰式命名 黍衙,類名首字母大寫(xiě)、
: - 固定寫(xiě)法
類的內(nèi)容 - 包含類的方法料扰、屬性和說(shuō)明文檔
? 方法就是聲明在類中的函數(shù)凭豪,
? 屬性就是聲明在類中的變量
- 語(yǔ)法
-
對(duì)象的聲明
語(yǔ)法:
類名() - 創(chuàng)建指定的類的對(duì)象# 聲明一個(gè)人類 class Person: """類的說(shuō)明文檔:人類""" num = 61 def eat(self): print('人在吃飯') # 創(chuàng)建Person類的對(duì);p1就是person的對(duì)象 p1 = Person() p1.eat()
對(duì)象方法
class 類名:
類的屬性
類的方法
類中的方法
聲明在類中的函數(shù)就是方法
類中的方法包括:對(duì)象方法(實(shí)例方法)晒杈,類方法嫂伞,靜態(tài)方法-
對(duì)象方法:
- 什么是對(duì)象方法
? 直接聲明在類中的方法就是對(duì)象方法
? 有默認(rèn)參數(shù)self
? 通過(guò) 對(duì)象.方法 的方式來(lái)調(diào)用(對(duì)象方法要通過(guò)對(duì)象來(lái)調(diào)用) - 參數(shù)
? 當(dāng)我們通過(guò)對(duì)象調(diào)用對(duì)象方法的時(shí)候,self不需要傳參;因?yàn)橄到y(tǒng)會(huì)將當(dāng)前對(duì)象傳遞給self
? 當(dāng)前對(duì)象: 調(diào)用當(dāng)前方法的對(duì)象(誰(shuí)調(diào)用對(duì)象方法的時(shí)候 self就是誰(shuí))
? 調(diào)用對(duì)象方法只給除self以外的參數(shù)傳參
class Person: def run(self): # print(self) print('人在跑步') def eat(self, food): self.run() print(food) def main(): # 創(chuàng)建對(duì)象 p1 = Person() # print(p1) # 通過(guò)對(duì)象p1調(diào)用對(duì)象方法 # p1.run() p1.eat('雞腿') if __name__ == '__main__': main()
- 什么是對(duì)象方法
init方法和構(gòu)造方法
init方法: init
init方法是類中的一個(gè)特殊的對(duì)象方法,專門(mén)用來(lái)對(duì)創(chuàng)建的對(duì)象進(jìn)行初始化的帖努。
當(dāng)通過(guò)類創(chuàng)建對(duì)象的時(shí)候系統(tǒng)會(huì)自動(dòng)調(diào)用init方法-
構(gòu)造方法
什么是構(gòu)造方法
函數(shù)名和類名相同的函數(shù)就是構(gòu)造方法撰豺,專門(mén)用來(lái)創(chuàng)造對(duì)象
python中聲明類的時(shí)候,系統(tǒng)會(huì)自動(dòng)創(chuàng)建這個(gè)類對(duì)應(yīng)的構(gòu)造方法-
構(gòu)造方法的執(zhí)行過(guò)程
當(dāng)我們調(diào)用構(gòu)造方法創(chuàng)造對(duì)象的時(shí)候拼余,內(nèi)部會(huì)先在內(nèi)存中開(kāi)辟空間保存對(duì)象污桦,然后用創(chuàng)建的這個(gè)對(duì)象調(diào)用init方法對(duì)對(duì)象進(jìn)行初始化
init方法調(diào)用結(jié)束后,返回對(duì)象def Person():
? 對(duì)象 = 創(chuàng)建對(duì)象
? 對(duì)象.init()
? return 對(duì)象
?
注意:如果類的init方法除了self以外還有其他參數(shù)姿搜,那么我們?cè)趧?chuàng)建對(duì)象的時(shí)候需要通過(guò)給構(gòu)造方法來(lái)給init方法傳參class Person: # 類中兩個(gè)下劃線開(kāi)頭并且兩個(gè)下劃線結(jié)尾的方法叫魔法方法寡润,不需要主動(dòng)調(diào)用,系統(tǒng)會(huì)自動(dòng)調(diào)用 def __init__(self): print('__init__被調(diào)用了') class Dog: def __init__(self, x, y): print('dog的init') # 構(gòu)造方法偽代碼 def my__init__(a, b): print(a, b) print('my__init__') def my_dog(*args, **kwargs): my__init__(*args, **kwargs) my_dog(a=10, b=20)
對(duì)象屬性
-
什么是對(duì)象屬性
類中的屬性分為類的字段和對(duì)象屬性- 對(duì)象屬性 - 屬性的值會(huì)因?yàn)閷?duì)象不同而不一樣舅柜,這種屬性就應(yīng)該聲明為對(duì)象屬性
聲明在init方法中 - 位置
以'self.屬性 = 值'的方式類聲明(這兒的屬性就是對(duì)象屬性) -- 方式
通過(guò)對(duì)象.屬性的方式來(lái)使用 - 類的字段 - 屬性的值不會(huì)因?yàn)閷?duì)象的不同而不同梭纹,這種屬性就聲明成類的字段
直接聲明在累的里面,函數(shù)的外面的變量
以'字段名 = 值'
通過(guò) '類.字段' 的方式來(lái)使用
class Person: def __init__(self, name, age): self.name = name self.age = age # 練習(xí):創(chuàng)建dog類致份,有屬性名字变抽,類型,年齡 # 創(chuàng)建Dog類的時(shí)候不能給年齡賦值可以給類型賦值氮块,也可以不用給類型賦值绍载,必須給名字賦值 # 對(duì)象方法eat:打印xxx在吃什么 class Dog: def __init__(self, name, type='哈士奇'): self.name = name self.age = 3 self.type = type def eat(self, food): print(self.name + ' is eating ' + food) # 練習(xí)聲明一個(gè)矩形,類滔蝉,擁有屬性長(zhǎng)击儡、寬,方法面積和周長(zhǎng) class Rectangle: num = 52 def __init__(self, length=4, width=3): self.length = length self.width = width def per(self): return 2*(self.length + self.width) def area(self): return self.length * self.width def main(): p1 = Person('張三', 20) print(p1.name, p1.age) p2 = Person('郭銳', 18) print(p2.name, p2.age) dog1 = Dog('郭銳', type='中華田園犬') dog1.eat('shit') rec1 = Rectangle() print(rec1.per()) print(rec1.area()) rec1 = Rectangle(length=8, width=6) print(rec1.per()) print(rec1.area()) print(rec1.num)
- 對(duì)象屬性 - 屬性的值會(huì)因?yàn)閷?duì)象不同而不一樣舅柜,這種屬性就應(yīng)該聲明為對(duì)象屬性
對(duì)象屬性的增刪改查
python中對(duì)象的屬性支持增刪改查
class Person:
def __init__(self, name='', age=0, sex='女'):
self.name = name
self.age = age
self.sex = sex
class Dog:
# __slots__ slots魔法
# 約束當(dāng)前類的對(duì)象最多能擁有的屬性
__slots__ = ('name', 'color')
def __init__(self, name='', color='black'):
self.name = name
self.color = color
def main():
p1 = Person('郭銳')
p2 = Person('孫悟空')
# 1.查
"""
對(duì)象.屬性 - 獲取指定對(duì)象屬性值蝠引;當(dāng)屬性不存在的時(shí)候回報(bào)錯(cuò)
getattr(對(duì)象, 屬性名:str, 默認(rèn)值) - 獲取指定對(duì)象指定屬性值;
當(dāng)屬性不存在的時(shí)候阳谍,如果給默認(rèn)值賦值,程序不會(huì)報(bào)錯(cuò)螃概,并且將默認(rèn)值作為結(jié)果矫夯。
若不賦值,就會(huì)報(bào)錯(cuò)
"""
print(p1.name)
print(getattr(p1, 'name', None))
print(getattr(p1, 'name', None))
# 屬性不確定的時(shí)候使用getattr
# 增/改
"""
對(duì)象.屬性 = 值 - 當(dāng)對(duì)象屬性存在時(shí)修改屬性的值吊洼, 屬性不存在的時(shí)候添加屬性
setattr(對(duì)象, 屬性名, 值) - 當(dāng)屬性存在的時(shí)候修改屬性的值训貌;不存在的時(shí)候添加
"""
print('===============增、改====================')
p1.name = '郭小瑞'
print(p1.name)
# 添加屬性
p1.height = 180
print(p1.height)
setattr(p1, 'height', 179)
setattr(p1, 'weight', 180)
print(p1.name, p1.age, p1.height, p1.weight)
# 刪
print('================刪除=======================')
"""
del 對(duì)象.屬性
delattr(對(duì)象, 屬性名)
"""
del p1.sex
# print(p1.sex)
# delattr(p1, 'sex')
# 對(duì)象指定的操作冒窍,只針對(duì)的哪一個(gè)對(duì)象递沪,你不會(huì)影響其他對(duì)象
# python中的對(duì)象支持 增刪改查
dog1 = Dog('大黃', 'yellow')
內(nèi)置屬性
內(nèi)置屬性指的是我們創(chuàng)建類的時(shí)候系統(tǒng)自動(dòng)個(gè)哦我們添加的屬性(其實(shí)是通過(guò)繼承獲取到了)
class Person:
"""人類"""
num = 61
# __slots__ = ('name', 'age', 'sex')
def __init__(self, name='', age=0, sex='男'):
self.name = name
self.age = age
self.sex = sex
# 定制對(duì)象的打印格式(當(dāng)我們通過(guò)print打印一個(gè)對(duì)象的時(shí)候,實(shí)質(zhì)就是打印對(duì)象調(diào)用__repe__的返回值)
# 這個(gè)函數(shù)的返回值是字符串
# def __repr__(self):
# # 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))
def eat(self, food):
print('%s在吃%s' % (self.name, food))
def main():
"""
1.類.__name__ - 獲取的名字
"""
p1 = Person('郭銳')
print(Person.__name__)
# 值是一個(gè)字符串超燃, 可以當(dāng)成字符串
class_name = Person.__name__
print(Person, class_name.upper())
"""
2.對(duì)象.__class__ - 獲取對(duì)象對(duì)應(yīng)的類
"""
# 獲取對(duì)象p1的類
my_class = p1.__class__
print(my_class)
# 可以將他當(dāng)做類來(lái)使用
p2 = my_class('大黃')
print(my_class.num)
"""
3.類.__doc__ - 獲取類的說(shuō)明文檔(str)
"""
print(my_class.__doc__)
print(int.__doc__)
"""
4.對(duì)象.__dict__ - 將對(duì)應(yīng)的對(duì)象轉(zhuǎn)換為字典区拳。將屬性和值作為字典的鍵值對(duì)(字典)
"""
# setattr(p1, 'height', 18)
print(p1.__dict__)
# 當(dāng)給slots賦值后,對(duì)象的__dict__的屬性就不能使用
# print(Person.__dict__)
"""
5.類.__module__ - 獲取當(dāng)前類所在的模塊的模塊名
"""
print(Person.__module__)
"""
6.類.__bases__ - 獲取當(dāng)前類的父類(元組)
"""
print(Person.__bases__)
print(p1.__repr__())
persons = [Person('p2', 12), Person('p3', 18, 'nv')]
print(persons)
類方法和靜態(tài)方法
-
對(duì)象方法:
- 怎么聲明:直接聲明在類型
- 特點(diǎn):知道self參數(shù)意乓,調(diào)用的時(shí)候不用傳參
- 怎么調(diào)用:對(duì)象.方法()
-
類方法:
- 怎么聲明: 聲明函數(shù)前加@classmethod
- 特點(diǎn):自帶cls默認(rèn)參數(shù),調(diào)用的不用傳參樱调,系統(tǒng)會(huì)自動(dòng)將調(diào)用當(dāng)前函數(shù)的類傳給他
? (cls是誰(shuí)調(diào)用就指向他)
? 類能做的事情cls都可以做约素, - 怎么調(diào)用:通過(guò)類來(lái)調(diào)用, 類.方法()
-
靜態(tài)方法:
- 怎么聲明: 聲明函數(shù)前加@staticmethod
- 特點(diǎn): 沒(méi)有默認(rèn)參數(shù)
- 怎么調(diào)用:通過(guò)類來(lái)調(diào)用笆凌, 類.方法()
-
在類中怎么選擇使用哪種方法
如果實(shí)現(xiàn)類中函數(shù)的功能需要使用對(duì)象的屬性圣猎,那么這個(gè)函數(shù)就要聲明成對(duì)象方法
如果實(shí)現(xiàn)函數(shù)的功能不需要使用對(duì)象屬性的嵌套下,如果需要類的字段乞而,就聲明成類方法
如果實(shí)現(xiàn)函數(shù)的功能既不需要對(duì)象屬性也不需要類的字段就聲明成靜態(tài)方法class Person: num = 61 def __init__(self): self.name = '張三' def func4(self): print('%s對(duì)應(yīng)的對(duì)象' % self.name) print('人類的數(shù)量:%d億' % Person.num) @classmethod def fun2(cls): print('我是第二個(gè)類方法') @classmethod def func1(cls): # 通過(guò)cls創(chuàng)建對(duì)象 p1 = cls() print(p1) print('cls:', cls) print('這是一個(gè)類方法') cls.num = 100 # cls來(lái)使用類的方法 print(cls.num) cls.fun2() # cls調(diào)用類方法 @staticmethod def func3(): print('這是一個(gè)靜態(tài)方法')