Python小知識點(5)--面向對象部分

面向對象:python

世間萬物,皆可分類。--------------------手機《--------------某一個分類git

世間萬物,皆爲對象。--------------------個人手機《---------有具體指向ide

只要是對象,就確定屬於某種品類。函數

只要是對象,就確定有屬性。學習

類的相同點一塊兒寫,不一樣點分開寫。編碼

 

1.Python類中self的來源:spa

一般函數的執行方式爲:3d

調用函數--》執行函數----》返回該函數的執行結果(獲得一個內存地址)code

Python類中方法卻不是這樣執行的,對象

而是在實例化對象的同時也將此時的對象名稱傳入。而後在類中__init__須要一個參數接受該對象,故選用selfself表明的是當前對象的引用,指向的是同一塊內存地址,因此不須要使用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 Code

8.1.2 構造函數的繼承

 

 若是咱們要給實例 c 傳參,咱們就要使用到構造函數,那麼構造函數該如何繼承,同時子類中又如何定義本身的屬性?

繼承類的構造方法:

        1.經典類的寫法: 父類名稱.__init__(self,參數1,參數2,...)

        2. 新式類的寫法:super(子類,self).__init__(參數1,參數2,....)

class Person(object):
 
    def __init__(self, name, age):
        self.name = name
        self.age = age
        
 
    def 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):
    pass
 
c = 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 = name
        self.age = age
      
 
    def talk(self):
        print("person is talking....")
 
class Chinese(Person):
 
    def __init__(self, name, age, language): 
        Person.__init__(self, name, age) 
        self.language = language
        print(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):
    pass

d = D()
# 結果輸出的爲B

 特別的:

 

9. 多態:一個接口多種實現。  做用:接口重用。

學習git爲     https://gitee.com/FelixBinCloud/PythonLearn/tree/master/PythonLearn

相關文章
相關標籤/搜索