日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python基础教程:多态、多继承、函数重写、迭代器详细教程

發布時間:2025/3/20 python 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python基础教程:多态、多继承、函数重写、迭代器详细教程 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

用于類的函數 issubclass(cls,class_or_tuple)

判斷一個類是否繼承自其他的類,如果此類cls是class或tuole中的一個派生(子類)則返回True,否則返回False

封裝 enclosure

封裝的目的是讓使用者盡可能少的引用實例變量(屬性)進行操作

私有屬性:python類中,以雙下劃線‘__’開頭,不以雙下劃線結尾的標識符為私有成員,在類的外部無法直接訪問。

class A:def __init__(self):self.__p1 = 100 #__p1為私有屬性,在類的外部不可訪問def test(self):print(self.__p1) # 可以訪問self.__m1() # A類的方法可以調用A類的私有方法def __m1(self):'''我是私有方法,只有我自己的類中的方法才能調用我哦'''print("我是A類的__m1方法!")a = A() # 創建對象# print(a.__p1) # 在類外看不到__p1屬性,訪問失敗!a.test()# a.__m1() # 出錯.無法調用私有方法

多態 polymorphic

多態是指在繼承\派生關系的類中,調用基類對象的方法,實際能調用子類的覆蓋版本方法的現象叫多態

''' 學習中遇到問題沒人解答?小編創建了一個Python學習交流QQ群:531509025 尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學習教程和PDF電子書! ''' class Shape:def draw(self):print("Shape.draw被調用")class Point(Shape)def draw(self):print('正在畫一個點')class Circle(Point):def draw(self):print("正在畫一個圓")def my_draw(s):s.draw() # 此處顯示出多態中的動態s1 = Circle() s2 = Point() my_draw(s1) # 調用Circle里的draw 正在畫一個圓 my_draw(s2) # 調用Point里的draw 正在畫一個點

多繼承 multiple inheritance

多繼承是指一個子類繼承自兩個或兩個以上的基類

說明:一個子類可以同時繼承自多個父類,父類中的方法可以同時被繼承下來。如果兩個父類中有同名的方法,而在子類中又沒有覆蓋此方法時,調用結果難以確定

class Car:def run(self, speed):print("汽車以", speed, '公里/小時的速度行駛')class Plane:def fly(self, height):print("飛機以海拔", height, '的高度飛行')class PlaneCar(Car, Plane):'''PlaneCar同時繼承自汽車類和飛機類'''p1 = PlaneCar() p1.fly(10000) p1.run(300)

多繼承的問題(缺陷):名字沖突問題,要謹慎使用多繼承(會先使用第一個繼承的基類)

命名沖突

class A:def m(self):print("A.m()被調用")class B:def m(self):print('B.m()被調用')class AB(A, B):passab = AB() ab.m() # A.m()被調用

繼承的MRO(Method Resolution Order)問題

類的__mro__屬性用來記錄繼承方法的查找順序

多繼承順序

''' 學習中遇到問題沒人解答?小編創建了一個Python學習交流QQ群:531509025 尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學習教程和PDF電子書! ''' class A:def m(self):print("A.m") class B(A):def m(self):print("B.m") class C(A):def m(self):print("C.m") class D(B, C):'''d類繼承自B,C'''def m(self):print("D.m") d = D() print(D.__mro__) #(<class '__main__.D'>, # <class '__main__.B'>, # <class '__main__.C'>, # <class '__main__.A'>, # <class 'object'>) d.m() # 調用方法的順序如上所示

多繼承順序2

class A:def m(self):print("A.m") class B(A):def m(self):print("B.m")super().m() class C(A):def m(self):print("C.m")super().m() class D(B, C):'''d類繼承自B,C'''def m(self):print("D.m")super().m() d = D() d.m() # 調用方法的順序是什么?for x in D.__mro__:print(x)# D.m # B.m # C.m # A.m # <class '__main__.D'> # <class '__main__.B'> # <class '__main__.C'> # <class '__main__.A'> # <class 'object'>

函數重寫

在自定義類內添加相應的方法,讓自定義類創建的實例能像內建對象一樣進行內建函數操作

對象轉字符串函數:

repr(obj) 返回一個能代表此對象的表達式字符串,通常eval(repr(obj))==obj (這個字符串通常是給python解釋執行器運行用的)

對象轉字符串函數的重寫方法

reper(obj)函數的重寫方法:

def__repr__(self):return 能夠表達self內容的字符串

str(obj)函數的重寫方法:

def__str__(self):return 人能看懂的字符串

重寫方法

class MyNumber:def __init__(self, value):self.data = valuedef __str__(self):print("__str__被調用")return "數字: %d" % self.datadef __repr__(self):print("__repr__被調用")return 'MyNumber(%d)' % self.data n1 = MyNumber(100) # print(str(n1)) # 調用 n1.__str__(self);__str__被調用;數字: 100 # print(repr(n1)) #__repr__被調用 MyNumber(100) print(n1) # ;__str__被調用;數字: 100 # n2 = eval("MyNumber(100)") # print(n2) #__str__被調用;數字: 100

說明:

1、str(obj)函數先調用obj.__str__()方法,調用此方法并返回字符串

2、如果obj沒有__str__()方法,則調用obj.__repr__()方法返回的字符串

3、如果obj沒有__repr__()方法,則調用object類的__repe__()實例方法顯示<xxxx>格式的字符串

數值轉換函數的重寫

def __complex__(self)  complex(obj) 函數調用 def __int__(self)    int(obj) 函數調用 def __float__(self)   float(obj) 函數調用 def __bool__(self)    bool(obj) 函數調用

自定義類可以轉成數值類型

'''此示例示意自定義的類MyNumber能夠轉成為數值類型''' class MyNumber:def __init__(self, v):self.data = vdef __repr__(self):return "MyNumber(%d)" % self.datadef __int__(self):'''此方法用于int(obj) 函數重載,必須返回整數此方法通常用于制訂自義定對象如何轉為整數的規則'''return 10000n1 = MyNumber(100) print(type(n1)) # if n1 == 100: # print("n1 == 100") n = int(n1) print(type(n)) print(n)

輸出:

<class '__main__.MyNumber'> <class 'int'> 10000

內建函數的重寫

__abs__      abs(obj) __len__      len(obj) __reversed__   reversed(obj) __round__     round(obj) # 自定義一個MyList類,與系統內建的類一樣, # 用來保存有先后順序關系的數據 ''' 學習中遇到問題沒人解答?小編創建了一個Python學習交流QQ群:531509025 尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學習教程和PDF電子書! ''' class MyList:'''自定義列表類'''def __init__(self, iterator=[]):self.data = [x for x in iterator]def __repr__(self):return "MyList(%r)" % self.datadef __abs__(self):# return MyList([abs(x) for x in self.data])# 上一句語句可以用如下生成表達式代替已防止過多占內存return MyList((abs(x) for x in self.data))def __len__(self):# return self.data.__len__()return len(self.data)myl = MyList([1, -2, 3, -4]) print(myl) print(abs(myl)) # MyList([1, +2, 3, +4]) print("原來的列表是:", myl)myl2 = MyList(range(10)) print(myl2) print('myl2的長度是:', len(myl2)) print('myl的長度是: ', len(myl))

輸出:

MyList([1, -2, 3, -4]) MyList([1, 2, 3, 4]) 原來的列表是: MyList([1, -2, 3, -4]) MyList([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) myl2的長度是: 10 myl的長度是: 4

布爾測試函數的重寫

格式 def bool(self):
   …
作用:
  用于bool(obj) 函數取值
  用于if語句真值表達式中
  用于while語句真值表達式中
說明:

  • 優先調用__bool__方法取值
  • 如果不存在__bool__方激動 ,則用__len__()方法取值后判斷是否為零值,如果不為零返回True,否則返回False
  • 如果再沒有__len__方法,則直接返回True
  • ''' 學習中遇到問題沒人解答?小編創建了一個Python學習交流QQ群:531509025 尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學習教程和PDF電子書! ''' class MyList:'''自定義列表類'''def __init__(self, iterator=[]):self.data = [x for x in iterator]def __repr__(self):return "MyList(%r)" % self.datadef __bool__(self):print("__bool__方法被調用!")return False# def __len__(self):# print("__len__被調用")# return len(self.data)myl = MyList([1, -2, 3, -4]) print(bool(myl)) # False if myl:print("myl 是真值") else:print("myl 是假值")

    輸出:

    __bool__方法被調用!False__bool__方法被調用!myl 是假值

    迭代器(高級)

    可以通過next(it) 函數取值的對象就是迭代器
    迭代器協議:迭代器協議是指對象能夠使用next函數獲取下一項數據,在沒有下一項數據時觸發一個StopIterator來終止迭代的約定
    實現方法:類內需要有 __next__(self)方法來實現迭代器協議
    語法形式:

    class MyIteratordef __next__(self):迭代器協議的實現return 數據

    可迭代對象是指能用iter(obj) 函數返回迭代器的對象(實例),可迭代對象內部一定要定義__iter__(self)方法來返回迭代器

    可迭代對象的語法形式:

    class MyIterable:def __iter__(self):語句塊return 迭代器 # 此示例示意可迭代對象和迭代器的定義及使用方式: class MyList:def __init__(self, iterator):'''自定義列表類的初始化方法,此方法創建一個data實例變量來綁定一個用來存儲數據的列表'''self.data = list(iterator)def __repr__(self):'''此方法了為打印此列表的數據'''return 'MyList(%r)' % self.datadef __iter__(self):'''有此方法就是可迭代對象,但要求必須返回迭代器'''print("__iter__方法被調用!")return MyListIterator(self.data)class MyListIterator:'''此類用來創建一個迭代器對象,用此迭代器對象可以迭代訪問MyList類型的數據'''def __init__(self, iter_data):self.cur = 0 # 設置迭代器的初始值為0代表列表下標# it_data 綁定要迭代的列表self.it_data = iter_datadef __next__(self):'''有此方法的對象才叫迭代器,此方法一定要實現迭代器協議'''print("__next__方法被調用!")# 如果self.cur已經超出了列表的索引范圍就報迭代結束if self.cur >= len(self.it_data):raise StopIteration# 否則尚未迭代完成,需要返回數據r = self.it_data[self.cur] # 拿到要送回去的數self.cur += 1 # 將當前值向后移動一個單位return rmyl = MyList([2, 3, 5, 7]) print(myl)for x in myl:print(x) # 此處可以這樣做嗎?# it = iter(myl) # x = next(it) # print(x) # x = next(it) # print(x) # x = next(it) # print(x)

    輸出:

    MyList([2, 3, 5, 7]) __iter__方法被調用! __next__方法被調用! 2 __next__方法被調用! 3 __next__方法被調用! 5 __next__方法被調用! 7 __next__方法被調用!

    總結

    以上是生活随笔為你收集整理的python基础教程:多态、多继承、函数重写、迭代器详细教程的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。