1. 程式人生 > 程式設計 >Python 面向物件部分知識點小結

Python 面向物件部分知識點小結

本文例項講述了Python 面向物件部分知識點。分享給大家供大家參考,具體如下:

面向物件:

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

世間萬物,皆為物件。--------------------我的手機《---------有具體指向

只要是物件,就肯定屬於某種品類。

只要是物件,就肯定有屬性。

類的相同點一起寫,不同點分開寫。

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例項變數(靜態屬性),作用域就是例項本身

實質為:

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,作用域就是例項本身
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...

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,age,language): # 先繼承,在重構
    Person.__init__(self,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,language): 
    Person.__init__(self,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','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

特別的:

Python 面向物件部分知識點小結

9. 多型:一個介面多種實現。 作用:介面重用。

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

更多關於Python相關內容感興趣的讀者可檢視本站專題:《Python面向物件程式設計入門與進階教程》、《Python資料結構與演算法教程》、《Python函式使用技巧總結》、《Python字串操作技巧彙總》、《Python編碼操作技巧總結》及《Python入門與進階經典教程》

希望本文所述對大家Python程式設計有所幫助。