day26多態

 =======================================概念===========================================
    1.多態
        多態是指對象通過他們共同的屬性和動作來操作及訪問,而不需要考慮他們具體的類
        多態指的是一類事物有多種形態,(一個抽象類有多個子類,因而多態的概念依賴於繼承)
        PYthon的三大特性:繼承,封裝,多態
        不同的對象調用相同的方法就是多態的體現,多態就是繼承的一種體現方式,多態就是繼承的實現細節
    2.封裝
        類就是麻袋:
        裝:把亂七八糟的一起裝進麻袋
        封:封就是把麻袋封上口子
        在面向對象裏面麻袋就是類,類和對象封裝了本身的數據屬性,
        真正意義上的封裝:明確區分內外,
        第一層面:類就是麻袋,本身就是一種封裝
        第二層面:類中定義私有屬性,只能在內部使用,外部無法訪問
    3.繼承
        類的繼承:1.改變  2.擴展
        多態就是類的這兩層意義的一個具體表現,調用不同的實例對象來
    4.面向對象的優點
        從編程的理論得知,面向對象是一種更高級的結構化編程方式,他的好處是兩點
        1:通過封裝明確內外,你的作爲類的締造者,你是上帝,上帝造物的邏輯你的無需知道,
        2.通過繼承+多態在語言層面支持歸一體設計

        注意:不用面嚮對象語言(class),一樣可以做歸一化(如老掉的文件概念,遊戲行業的一切皆精靈)一樣可以封裝(通過定義模塊和接口),只是用面嚮對象語言可以直接用語言元素顯示聲明這些而已,
        而用了面嚮對象語言,滿篇class,並不等於就有啦歸一化的設計,甚至,因爲被這些花哨的東西迷惑,反而更加不知道什麼纔是設計
    5.Python中關於OOP的常用術語
        抽象/實現

    6.反射
        反射的概念:程序可以通過訪問。檢測,和修改它本身轉態或行爲
        4個函數實現
        反射只有在實例調用的時候才能被使用,
        hasattr
        setattr
        getattr
        delattr
        hasattr(object,'name') ->>object.name #可以加上默認值,找不到的情況下提示什麼
        getattr(object,'name',default='xxx') -->>object.name  找不到屬性觸發
        setattr(object,'name','egon') ->>object.name='egon'  設置屬性的時候觸發
        delattr(object,'name') -->>del object.name  


    7.包裝
        包裝是將原有的方法進行添加,修改,刪除原來的產品的功能,其他的保持原樣,授權的過程,即是所以的功能都是由新類的某部分來處理,但已存在的功能就授權給對象的默認屬性
        實際上授權的關鍵點就是覆蓋  __getattr()的方法
========================================封裝===========================================
    class People():
        _start='earth_start'
        __star='earth__star'
        def __init__(self,id,name,age,salary):
            print('---->>>>',self.__star)
            self.id=id
            self.name=name
            self.age=age
            self.salary=salary
        def get_id(self):
            print('我是私有方法,我找的id 是【%s】'%self.id)
        def get_star(self):
            print(self._start)
            print(self.__star)
    #print(People.__dict__)
    p1=People('125233','olen','18',181202)
    p1.get_id()
    # print(p1._start)
    # # _ 下劃線隱藏起來的
    # #print(p1.__star)
    # print(p1.__dict__)
    # print(People._start)
    # print(People.__dict__)
    p1.get_star()
========================================ftp_client=====================================
    class FtpClient():
        '這是一個ftp 客戶端,但是沒有具體的功能'
        def __init__(self,addr):
            print('正在連接服務器【%s】'%addr)
            self.addr=addr
        def put(self):
            print('正在上傳文件')
========================================動態導入模塊====================================
    from  m1 import t #m1/t
    # module_t=__import__('m1.t')
    # print(module_t)
    # from m1.t import test1,_test2
    # #from m1.t import *
    #
    # test1()
    # _test2()

    # module_t1=__import__('m1.t')
    # print(module_t1)
    #
    # import importlib
    # m=importlib.import_module('m1.t')
    # print(m)
    # m.test1()
========================================包裝標準類型====================================
    class List(list):
        def append(self, p_object):
            if type(p_object) is str:
                #list.append(self,p_object)
                super().append(p_object)
            else:
                print('只能添加字符串類型')
        def show_madle(self):
            mid_index=int(len(self)/2)
            return self[mid_index]

    l1=List('helloworld')
    # l2=list('hello world')
    # print(l2,type(l2))
    # print(l1,type(l1))
    # print(l1.show_madle())
    l1.append('hello')
    print(l1)
========================================雙下劃線開頭的attr方法===========================
    class Foo():
        def __init__(self,name):
            self.name=name


        def __getattr__(self, item):
            print('你的屬性【%s】不存在'%item)
        def __setattr__(self, key, value):
            print('執行setattr',key,value)
            if type(value) is str:
                print('開始設置')
                self.__dict__[key]=value
            else:
                print('必須是字符串')
        def __delattr__(self, item):
            print('刪除屬性',item)
            self.__dict__.pop(item)

    f1=Foo('alex')
    f1.age=18
    f1.gender='male'
    print(f1.__dict__)
    # print(f1.age)
    # print(f1.name)
    #print(dir(f1))
    del f1.name
    print(f1.__dict__)
========================================反射============================================
    class BlackMedium:
        feture='ugly'
        def __init__(self,name,addr):
            self.name=name
            self.addr=addr
        def sell_hourse(self):
            print('【%s】正在賣房子,傻逼纔買'%self.name)

        def rent_house(self):
            print('【%s】正在租房子,傻逼才租房子' % self.name)
    b1=BlackMedium('萬成置地','天露園')
    # print(hasattr(b1,'name'))
    # print(getattr(b1,'name'))
    # print(getattr(b1,'named','沒有這個參數'))
    # b1.sb=True
    # setattr(b1,'ab',True)
    # setattr(b1,'ab1',123)
    # setattr(b1,'name',"SB")
    # print(b1.__dict__)
    # delattr(b1,'sb')
    # print(b1.__dict__)


    setattr(b1,'fuc',lambda x:x+1)
    print(b1.__dict__)
    print(b1.fuc(8))
========================================多態===========================================
    class H2O():
        def __init__(self,name,temperature):
            self.name=name
            self.temperature=temperature
        def turn_ice(self):
            if self.temperature < 0:
                print('%s 溫度太低結冰啦'%self.name)
            elif self.temperature > 0 and self.temperature < 100:
                print('%s 液化成水'%self.name)
            elif self.temperature > 100:
                print('%s 溫蒂太高成水蒸氣'%self.name)
    class Water(H2O):
        pass
    class Ice(H2O):
        pass
    class Steam(H2O):
        pass

    w1=Water('水',25)
    i1=Ice('冰',-20)
    s1=Steam('蒸汽',3000)
    w1.turn_ice()
    i1.turn_ice()
    s1.turn_ice()
    #全部的數據類型都是繼承於type()
    #運行時候的綁定狀態
    def func():
        pass

    func()
========================================封裝示範一======================================
    #_*_coding:utf-8_*_
    __author__ = 'Linhaifeng'

    class Room:
        def __init__(self,name,owner,width,length,high):
            self.name=name
            self.owner=owner
            self.__width=width
            self.__length=length
            self.__high=high

        def tell_area(self): #此時我們想求的是面積
            return self.__width * self.__length *self.__high

        def tell_width(self):
            return self.__width


    r1=Room('衛生間','alex',100,100,10000)

    # arear=r1.__width * r1.__length
    print(r1.tell_area())
========================================授權===========================================
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章