Python小知识点(5)--面向对象部分
面向對象:
世間萬物,皆可分類。--------------------手機《--------------某一個分類
世間萬物,皆為對象。--------------------我的手機《---------有具體指向
只要是對象,就肯定屬于某種品類。
只要是對象,就肯定有屬性。
類的相同點一起寫,不同點分開寫。
?
1.Python類中self的來源:
通常函數的執行方式為:
調用函數--》執行函數----》返回該函數的執行結果(得到一個內存地址)
Python類中方法卻不是這樣執行的,
而是在實例化對象的同時也將此時的對象名稱傳入。然后在類中__init__需要一個參數接受該對象,故選用self,self代表的是當前對象的引用,指向的是同一塊內存地址,所以不需要使用return返回值。
?
2.為什么類中的方法最少有一個self參數?
這是由于類中的方法是類內部共存(共享)的,不像其他字段屬性每次都在內存中復制得有,但是得知道每次調用該方法的對象是誰,需要將調用這個方法的對象傳遞到該方法中,故需要一個self接收該對象。在底層是通過----》類.方法(對象名)實現該過程的。最終的實現是誰調用這個方法,誰就把自己傳遞給該方法。 類名.方法名(類的對象)
r=Role(‘WFB’) ?Role是一個類,類中有一個got_shot()方法。
r.got_shot()======》實質為Role.got_shot(r)
?
3.在構造函數中初始化:在內存中開辟一塊空間,然后將一些值進行存儲。對于沒有在構造函數中初始化的方法是在類的內存當中的,而不是在實例的內存空間里。
?
4.python 類變量和實例變量
類變量既可以通過實例也可以通過類來訪問,這是因為訪問順序是默認先訪問實例的,若實例中沒有則來訪問類的。
實例變量是可以增加的,也是可以刪除的,體現為:
4.1增加
4.1.1??在類初始化時是通過構造函數__init__()中接收的self參數然后進行賦值,如下
class Role:def __init__(self, name):#在實例化時做一些類的初始化的工作 self.name = name #實質為r1.name=name實例變量(靜態屬性),作用域就是實例本身 View Code實質為:
r=Role(“wfb”)===>r=Role(r,”wfb”) ,然后通過r.name=name在構造函數中進行賦值。
4.1.2? 在類實例后單獨增加,現在新增一個實例變量范圍只針對該實例。
例如:
r=Role("wfb") r.gender="男"上述兩者實質是一樣的,只是賦值時間有區別,一個是在類在實例化(調用構造函數)時賦值。一個是在實例化之后再在賦值操作。同樣可以達到為某實例增加屬性的目的。
4.2刪除? ?
刪除實例變量(只是針對當前的對象)。
方式為=>?
del r.name??這樣該實例就沒有了該變量,但是不會影響其他的實例變量。
5.在實例中是否可以改類中的類變量??
class Role: n=”我是類變量”def __init__(self, name):#在實例化時做一些類的初始化的工作self.name = name #實質為r1.name=name實例變量(靜態屬性),作用域就是實例本身 r1=Role(“wfb”) r1.n=”我是修改后變量” Print(“r.n===%s”%r.n) #=====>輸出我是修改后變量 r2=Role(“WFB Nice”) Print(“r2.n===%s”%r2.n) #======>輸出為我是類類變量。 #先在實例中查找是否有n,沒有則去查找類中是否有。總結:通過試驗可以知道 我們通過實例修改類中同名的變量,實質為是在該實例的內存中新增了一個與類變量同名的實例變量。其他實例來調用該類中的類變量時,其中類變量的值是沒有發生變化的。
6.通過類是否可以直接修改類的的類變量??【類名.類變量==值】、
結論為:若實例中已有新增的與類變量同名的則變量值為實例中的變量值,否則則是修改后的類變量值,這是由于訪問順序是默認先訪問實例的,若實例中沒有則來訪問類的。
需要注意的是若變量是一個list則修改一個影響全部,這是由于他們共用的是同一個內存地址。
實例變量是為了區別每個對象的不同點,而類變量是該類所用實例對象共用的。當某個對象實例中關于這個類變量需要不同值,可以為該對象實例新增一個與類變量同名的實例變量。
?
7.私有屬性、私有方法=====》體現了封裝
格式為:
私有屬性:__attr? ?
私有方法:def __way(self): pass
特性:只能是在改類中訪問,若外部需要私有屬性或者方法,解決方法為在該類的內部定義一個可供外部訪問的方法,然后在該方法中調用私有屬性或方法。
?
8.繼承
繼承是指這樣一種能力:它可以使用現有類的所有功能,并在無需重新編寫原來的類的情況下對這些功能進行擴展。
繼承概念的實現方式主要有2類:實現繼承、接口繼承。
實現繼承是指使用基類的屬性和方法而無需額外編碼的能力。
接口繼承是指僅使用屬性和方法的名稱、但是子類必須提供實現的能力(子類重構父類方法)。
?8.1 類的繼承
8.1.1 繼承的定義
class Person(object): # 定義一個父類def talk(self): # 父類中的方法print("person is talking....") class Chinese(Person): # 定義一個子類, 繼承Person類def walk(self): # 在子類中定義其自身的方法print('is walking...')c = Chinese() c.talk() # 調用繼承的Person類的方法 c.walk() # 調用本身的方法# 輸出 person is talking.... is walking... View Code8.1.2 構造函數的繼承
?
如果我們要給實例 c 傳參,我們就要使用到構造函數,那么構造函數該如何繼承,同時子類中又如何定義自己的屬性?
繼承類的構造方法:
? ? ? ? 1.經典類的寫法: 父類名稱.__init__(self,參數1,參數2,...)
? ? ? ? 2. 新式類的寫法:super(子類,self).__init__(參數1,參數2,....)
class Person(object):def __init__(self, name, age):self.name = nameself.age = agedef talk(self):print("person is talking....")class Chinese(Person):def __init__(self, name, age, language): # 先繼承,在重構Person.__init__(self, name, age) #繼承父類的構造方法,也可以寫成:super(Chinese,self).__init__(name,age)self.language = language # 定義類的本身屬性def walk(self):print('is walking...')class American(Person):passc = Chinese('wfb', 22, 'Chinese')總結:假如只是簡單的在子類Chinese中定義一個構造函數,其實就是在重構。這樣子類就不能繼承父類的屬性了。所以我們在定義子類的構造函數時,要先繼承再構造,這樣我們也能獲取父類的屬性了。
子類構造函數基礎父類構造函數過程如下:
? ? ? 實例化對象c ----> c 調用子類__init__() ?---- > 子類__init__()繼承父類__init__() ?----- > 調用父類?__init__()
?8.1.3 對父類方法的繼承
?如果我們對基類/父類的方法需要修改,可以在子類中重構該方法。如下的talk()方法。
class Person(object):def __init__(self, name, age):self.name = nameself.age = agedef talk(self):print("person is talking....")class Chinese(Person):def __init__(self, name, age, language): Person.__init__(self, name, age) self.language = languageprint(self.name, self.age, self.language)def talk(self): # 子類 重構方法print('%s is speaking chinese' % self.name)def walk(self):print('is walking...')c = Chinese('wfb', 22, 'Chinese') c.talk()# 輸出 wfb is speaking chinese關于多繼承是按照從左到右【代碼中提現方式】繼承的,在繼承上存在一個先后關系,其中構造函數只會繼承一個(從從左到右誰先有就繼承誰的)。
?例如:
class A:def __init__(self):print("A") class B(A):def __init__(self):print("B")class C(A):def __init__(self):print("C")class D(B, C):passd = D()# 結果輸出的為B
?特別的:
?
9. 多態:一個接口多種實現。 ?作用:接口重用。
學習git為? ? ?https://gitee.com/FelixBinCloud/PythonLearn/tree/master/PythonLearn
posted on 2018-08-05 14:03 WFaceBoss 閱讀(...) 評論(...) 編輯 收藏轉載于:https://www.cnblogs.com/wfaceboss/p/9425329.html
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的Python小知识点(5)--面向对象部分的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: docker-macvlan网络
- 下一篇: Hexo+OSChina(码云)+git