python源碼與多態

''' 1.多態一種事物具有不一樣的形態ps:水 固態  液態 氣態官方:多個不一樣類對象能夠響應同一個方法,產生不一樣的結果多個對象有相同的使用方法,# 對於使用者會大大下降其是用難度 如以前寫的usb接口'''class JI:    def bark(self):        print("哥哥哥")    def spawn(self):        print("下雞蛋..")class Duck:    def bark(self):        print("嘎嘎嘎")    def spawn(self):        print("下鴨蛋")class E:    def bark(self):        print("餓餓餓....")    def spawn(self):        print("下鵝蛋..")j = JI()y = Duck()e = E()def mange(obj):    obj.spawn()mange(j)mange(y)mange(e)# python中處處都有多態a = 10b = "10"c = [10]print(type(a))print(type(b))print(type(c))# 2.oop中的interface與issubclass'''interface判斷一個對象是不是某個類的實例參1 要判斷的對象參2 要判斷的類型issubclass判斷一個類是不是另外一個類的字類參1 字類參2 父類'''# def add_num(a,b):##     if isinstance(a,int) and isinstance(b,int):#         return a+b#     return None## print(add_num(20,10))class Animal:    def eat(self):        print("動物得吃東西...")class Pig(Animal):    def eat(self):        print("豬得吃 豬食....")class Tree:    def light(self):        print("植物光合做用....")pig = Pig()t = Tree()## def manage(obj):#     if issubclass(type(obj),obj):#         obj.eat()#     else:#         print("不是一頭動物!")## # manage(pig)## manage(t)# print(issubclass(Tree,object))# 3.雙下劃線系列的magic函數,即源代碼'''__str__會在對象被轉爲字符串時,轉換的結果就是這個函數的返回值使用場景:咱們能夠利用該函數來自定義,對象的打印格式del執行時機:手動刪除對象立馬執行,或程序結束時也會運行使用場景:當你的對象在使用過程當中,打開了不屬於解釋器的資源:如文件,網絡端口# del使用案例# class FileTool:#     """該類用於簡化文件的讀寫操做 """# #     def __init__(self,path):#         self.file = open(path,"rt",encoding="utf-8")#         self.a = 100# #     def read(self):#         return self.file.read()# #     # 在這裏能夠肯定一個事,這個對象確定不使用了 因此能夠放心的關閉問文件了#     def __del__(self):#         self.file.close()# # # tool = FileTool("a.txt")# print(tool.read())call執行時機:在調用對象時自動執行,(即對象加括號)class A:    def __call__(self, *args, **kwargs):        print("call run")        print(args)        print(kwargs)a = A()a(1,a=100)slots該屬性是一個類屬形,用於優化內存佔用,這個時候沒法使用__dict__另外當類中出現了slots時將致使這個類的對象沒法在添加新的屬性class Person:    __slots__ = ["name"]    def __init__(self,name):        self.name = namep =  Person("jck")# 查看內存佔用# print(sys.getsizeof(p))# p.age = 20 # 沒法添加# dict 沒有了print(p.__dict__)'''# 4.'''getarttr 用點訪問屬性時若是屬性不存在則執行setattr 用點設置屬性時delatter 用del 對象.屬性 刪除屬性時 執行這幾個函數反映了python解釋器是如何實現 用點來訪問屬性的在獲取屬性時若是存在gertattribute則先執行該函數,若是沒有拿到屬性則繼續調用getattr函數,若是拿到了則直接返回# getitem setitem delitem任何的符號 都會被解釋器解釋成特殊含義 ,例如 .  [] () ```pythongetitem 當你用中括號去獲取屬性時 執行setitem  當你用中括號去設置屬性時 執行delitem 當你用中括號去刪除屬性時 執行```'''5.運算符重載'''gt 大於lt 小於eq 等於'''class Student(object):    def __init__(self, name, height, age):        self.name = name        self.height = height        self.age = age    def __gt__(self, other):        # print(self)        # print(other)        # print("__gt__")        return self.height > other.height    def __lt__(self, other):        return self.height < other.height    def __eq__(self, other):        if self.name == other.name and self.age == other.age and self.height == other.height:            return True        return Falsestu1 = Student("jack", 180, 28)stu2 = Student("jack", 180, 28)# print(stu1 < stu2)print(stu1 == stu2)6.迭代器協議# 迭代器是指有__inter__和__next__的對象# 咱們能夠爲對象增長這兩個方法來讓對象變成一個迭代器class MyRange:    def __init__(self, start, end, step):        self.start = start        self.end = end        self.step = step    def __iter__(self):        return self    def __next__(self):        a = self.start        self.start += self.step        if a < self.end:            return a        else:            raise StopIterationfor i in MyRange(1, 10, 2):    print(i)# 7.上下文管理# 涉及到的兩個方法:## ## enter## ​    表示進入上下文,(進入某個場景 了)## ## exit##   表示退出上下文,(退出某個場景 了)#### 當執行with 語句時,會先執行enter ,## 當代碼執行完畢後執行exit,或者代碼遇到了異常會當即執行exit,並傳入錯誤信息## 包含錯誤的類型.錯誤的信息.錯誤的追蹤信息##   表示退出上下文,(退出某個場景 了)#### 當執行with 語句時,會先執行enter ,## 當代碼執行完畢後執行exit,或者代碼遇到了異常會當即執行exit,並傳入錯誤信息## 包含錯誤的類型.錯誤的信息.錯誤的追蹤信息# 注意# enter 函數應該返回對象本身# exit函數 能夠有返回值,是一個bool類型,用於表示異常是否被處理,僅在上下文中出現異常有用# 若是爲True 則意味着,異常以及被處理了# False,異常未被處理,程序將中斷報錯
相關文章
相關標籤/搜索