python 2 类与对象
1、類與對(duì)象的概念
類即類別、種類,是面向?qū)ο笤O(shè)計(jì)最重要的概念,從一小節(jié)我們得知對(duì)象是特征與技能的結(jié)合體,而類則是一系列對(duì)象相似的特征與技能的結(jié)合體。
那么問題來了,先有的一個(gè)個(gè)具體存在的對(duì)象(比如一個(gè)具體存在的人),還是先有的人類這個(gè)概念,這個(gè)問題需要分兩種情況去看
(1)在現(xiàn)實(shí)世界中:肯定是先有對(duì)象,再有類世界上肯定是先出現(xiàn)各種各樣的實(shí)際存在的物體,然后隨著人類文明的發(fā)展,人類站在不同的角度總結(jié)出了不同的種類,比如
人類、動(dòng)物類、植物類等概念。也就說,對(duì)象是具體的存在,而類僅僅只是一個(gè)概念,并不真實(shí)存在,比如你無法告訴我人類具體指的是哪一個(gè)人。
(2)在程序中:務(wù)必保證先定義類,后產(chǎn)生對(duì)象
這與函數(shù)的使用是類似的:先定義函數(shù),后調(diào)用函數(shù),類也是一樣的:在程序中需要先定義類,后調(diào)用類。不一樣的是:調(diào)用
函數(shù)會(huì)執(zhí)行函數(shù)體代碼返回的是函數(shù)體執(zhí)行的結(jié)果,而調(diào)用類會(huì)產(chǎn)生對(duì)象,返回的是對(duì)象
?
1>把一類事物的靜態(tài)屬性和動(dòng)態(tài)可以執(zhí)行的操作組合在一起所得到的這個(gè)概念就是類 2>類的一個(gè)個(gè)體就是對(duì)象,對(duì)象是具體的,實(shí)實(shí)在在的事物 3>對(duì)象是特征與技能的結(jié)合體,其中特征和技能分別對(duì)應(yīng)對(duì)象的數(shù)據(jù)屬性和方法屬性 4>對(duì)象(實(shí)例)本身只有數(shù)據(jù)屬性,但是python的class機(jī)制會(huì)將類的函數(shù)綁定到對(duì)象上,稱為對(duì)象的方法,或者叫綁定方法,綁定方法唯一綁定一個(gè)對(duì)象,同一個(gè)類的方法綁定到不同的對(duì)象上,屬于不同的方法,內(nèi)存地址都不會(huì)一樣 在類內(nèi)部定義的屬性屬于類本身的,由操作系統(tǒng)只分配一塊內(nèi)存空間,大家公用這一塊內(nèi)存空間 5>創(chuàng)建一個(gè)類就會(huì)創(chuàng)建一個(gè)類的名稱空間,用來存儲(chǔ)類中定義的所有名字,這些名字稱為類的屬性:而類中有兩種屬性:數(shù)據(jù)屬性和函數(shù)屬性,其中類的數(shù)據(jù)屬性是共享給所有對(duì)象的,而類的函數(shù)屬性是綁定到所有對(duì)象的。 6>創(chuàng)建一個(gè)對(duì)象(實(shí)例)就會(huì)創(chuàng)建一個(gè)對(duì)象(實(shí)例)的名稱空間,存放對(duì)象(實(shí)例)的名字,稱為對(duì)象(實(shí)例)的屬性 7>在obj.name會(huì)先從obj自己的名稱空間里找name,找不到則去類中找,類也找不到就找父類…最后都找不到就拋出異常。 8>類的相關(guān)方法:類的相關(guān)方法(定義一個(gè)類,也會(huì)產(chǎn)生自己的名稱空間) 類名.__name__ # 類的名字(字符串) 類名.__doc__ # 類的文檔字符串 類名.__base__ # 類的第一個(gè)父類(在講繼承時(shí)會(huì)講) 類名.__bases__ # 類所有父類構(gòu)成的元組(在講繼承時(shí)會(huì)講) 類名.__dict__ # 類的字典屬性、名稱空間 類名.__module__ # 類定義所在的模塊 類名.__class__ # 實(shí)例對(duì)應(yīng)的類(僅新式類中)1.創(chuàng)建出類會(huì)產(chǎn)生名稱空間,實(shí)例化對(duì)象也會(huì)產(chǎn)生名稱空間。2.用戶自己定義的一個(gè)類,實(shí)際上就是定義了一個(gè)類型,類型與類是統(tǒng)一的。3.用戶先是從自己的命名空間找,如果找不大,在從類的命名空間找。student1.langage = "1111"print(student1.__dict__) ===>先是從自己的命名空間找print(Student.__dict__) ===>然后在從類的命名空間找4.通過類來訪問,訪問的是函數(shù),通過對(duì)象來訪問,訪問的是方法,在類內(nèi)部定義的方式實(shí)際上是綁定到對(duì)象的身上來用的。 <function Student.fun at 0x000000000267DAE8> <bound method Student.fun of <__main__.Student object at 0x0000000002684128>><function Student.fun at 0x00000000025CDAE8> <bound method Student.fun of <__main__.Student object at 0x00000000025D4160>> <bound method Student.fun of <__main__.Student object at 0x00000000025D4198>>5.總結(jié):類的數(shù)據(jù)屬性是大家共有的,而且大家的內(nèi)部地址是一樣的,用的就是一個(gè)類的函數(shù)屬性是綁定到大家身上的,內(nèi)部地址不一樣,綁定方法指的是綁定到對(duì)象身上。綁定方法:綁定到誰的身上,就是給誰用的,誰來調(diào)用就會(huì)自動(dòng)把自己當(dāng)做第一個(gè)參數(shù)傳入。**定義在類內(nèi)部的變量,是所有對(duì)象共有的,id全一樣,**定義在類內(nèi)部的函數(shù),是綁定到所有對(duì)象的,是給對(duì)象來用的,obj.fun()會(huì)把obj本身當(dāng)做一個(gè)參數(shù)來傳遞。6.在類內(nèi)部定義的函數(shù)雖然可以由類來調(diào)用,但是并不是為了給類用的,在類內(nèi)部定義的函數(shù)的目的就是為了綁定到對(duì)象身上的。7.在類的內(nèi)部來說,__init__是類的函數(shù)屬性,但是對(duì)于對(duì)象來說,就是綁定方法。8.命名空間的問題:先從對(duì)象的命名空間找,隨后在從類的命名空間找,隨后在從父類的命名 空間找。 print(student1.x)9.在定義類的時(shí)候,可以想什么先寫什么。2、定義類
按照上述步驟,我們來定義一個(gè)類
(1)在現(xiàn)實(shí)世界中,先有對(duì)象,再有類
對(duì)象1:李坦克特征:學(xué)校=oldboy姓名=李坦克性別=男年齡=18技能:學(xué)習(xí)吃飯睡覺對(duì)象2:王大炮特征:學(xué)校=oldboy姓名=王大炮性別=女年齡=38技能:學(xué)習(xí)吃飯睡覺對(duì)象3:牛榴彈特征:學(xué)校=oldboy姓名=牛榴彈性別=男年齡=78技能:學(xué)習(xí)吃飯睡覺(2)在程序中,必須先定義類,后使用類(用來產(chǎn)生對(duì)象)
#在Python中程序中的類用class關(guān)鍵字定義,而在程序中特征用變量標(biāo)識(shí),技能用函數(shù)標(biāo)識(shí),因而類中最常見的無非是:變量和函數(shù)的定義# 先定義類
class OldboyStudent:school='oldboy'def learn(self):print('is learning')def eat(self):print('is eating')def sleep(self):print('is sleeping')
# 后產(chǎn)生對(duì)象
stu1 = OldboyStudent() stu2 = OldboyStudent() stu3 = OldboyStudent()
print(stu1) print(stu2) print(stu3)
?
- 類中可以有任意python代碼,這些代碼在類定義階段便會(huì)執(zhí)行,因而會(huì)產(chǎn)生新的名稱空間,用來存放類的變量名與函數(shù)名,可以通過OldboyStudent.__dict__查看
- 類中定義的名字,都是類的屬性,點(diǎn)是訪問屬性的語法。
- 對(duì)于經(jīng)典類來說我們可以通過該字典操作類名稱空間的名字,但新式類有限制(新式類與經(jīng)典類的區(qū)別我們將在后續(xù)章節(jié)介紹
3、類的使用
3.1、引用類的屬性
?
class OldboyStudent:school='oldboy'
def learn(self):
print('is learning')
def eat(self):
print('is eating')
def sleep(self):
print('is sleeping')
# 后產(chǎn)生對(duì)象
stu1 = OldboyStudent()
stu2 = OldboyStudent()
stu3 = OldboyStudent()
print(stu1)
print(stu2)
print(stu3)
print(OldboyStudent.school) #查 輸出結(jié)果:oldboy
OldboyStudent.school='Oldboy2' #改
print(OldboyStudent.school)# 輸出結(jié)果:Oldboy2
OldboyStudent.x=1 #增
print(OldboyStudent.x) #輸出結(jié)果 1
del OldboyStudent.x #刪
print(OldboyStudent.x)
輸出結(jié)果:
AttributeError: type object 'OldboyStudent' has no attribute 'x'
3.2、調(diào)用類,或稱為實(shí)例化,得到程序中的對(duì)象
stu1 = OldboyStudent() stu2 = OldboyStudent() stu3 = OldboyStudent() #如此,s1、s2、s3都一樣了,而這三者除了相似的屬性之外還各種不同的屬性,這就用到了__init____init__方法 # 用來為對(duì)象定制自己獨(dú)特的屬性 #注意:該方法是在對(duì)象產(chǎn)生之后才會(huì)執(zhí)行,只用來為對(duì)象進(jìn)行初始化操作,可以有任意代碼,但一定不能有返回值 class OldboyStudent:......def __init__(self,name,age,sex):self.name=nameself.sex=sexself.age=age......s1=OldboyStudent('李坦克','男',18) #先調(diào)用類產(chǎn)生空對(duì)象s1,然后調(diào)用OldboyStudent.__init__(s1,'李坦克','男',18) s2=OldboyStudent('王大炮','女',38) s3=OldboyStudent('牛榴彈','男',78)
4、對(duì)象的使用
class OldboyStudent:school = 'oldboy'def __init__(self,name,sex,age):self.name=nameself.sex=sexself.age = agedef learn(self):print('is learning')def eat(self):print('is eating')def sleep(self):print('is sleeping')s1=OldboyStudent('李坦克','男',18) #先調(diào)用類產(chǎn)生空對(duì)象s1,然后調(diào)用OldboyStudent.__init__(s1,'李坦克','男',18) s2=OldboyStudent('王大炮','女',38) s3=OldboyStudent('牛榴彈','男',78) print(s1.__dict__) print(s2.__dict__) print(s3.__dict__)結(jié)果: {'name': '李坦克', 'sex': '男', 'age': 18} {'name': '王大炮', 'sex': '女', 'age': 38} {'name': '牛榴彈', 'sex': '男', 'age': 78}?
#執(zhí)行__init__,s1.name='牛榴彈',很明顯也會(huì)產(chǎn)生對(duì)象的名稱空間可以用s2.__dict__查看,查看結(jié)果為 {'name': '王大炮', 'age': '女', 'sex': 38}s2.name #查,等同于s2.__dict__['name'] s2.name='王三炮' #改,等同于s2.__dict__['name']='王三炮' s2.course='python' #增,等同于s2.__dict__['course']='python' del s2.course #刪,等同于s2.__dict__.pop('course')5、補(bǔ)充說明
- 站的角度不同,定義出的類是截然不同的;
- 現(xiàn)實(shí)中的類并不完全等于程序中的類,比如現(xiàn)實(shí)中的公司類,在程序中有時(shí)需要拆分成部門類,業(yè)務(wù)類等;
- 有時(shí)為了編程需求,程序中也可能會(huì)定義現(xiàn)實(shí)中不存在的類,比如策略類,現(xiàn)實(shí)中并不存在,但是在程序中卻是一個(gè)很常見的類。
?
轉(zhuǎn)載于:https://www.cnblogs.com/foremostxl/p/9571782.html
總結(jié)
以上是生活随笔為你收集整理的python 2 类与对象的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php ajax session死锁,s
- 下一篇: python源码剖析_《Python源码