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())
========================================授权===========================================
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章