• 17 多态 封装 反射


    多态 此概念指出对象如何通过他们共同属性 动作进行访问 而不必考虑他们具体的事

    class H2O:
        def __init__(self,name,temperature)
        def turn_ice(self):
    class Water(H2O):
    class Ice(H2O):
    class Steam(H2O):
    w1 = Water('',25)
    w1.turn_ice()


    如同数据类型的
    s.__len__() list.__len__()

    第一个层面的封装 类就是麻袋 这本身就是一种封装
    第二个层面的封装 类中定义私有的 只有在你类的内部访问 外部无法访问
    第三个层面的封装 明确却分内外 内部的实现逻辑 外部无法知晓
    并且为封装到内部的逻辑提供一个访问接口给外部使用

    class Room:
        def __init__(self,name,owner,width,length,high):
            self.name =name
            self._width = width
        def area(self):
            return self._width * self._length
    
    r1 = Room('卫生间''alex',100,100,10000)
    print(r1.tell_area())

    面向对象是一种更高级的结构化编程方式 好处
    1 通过封装明确了内外 作为类的缔造者 你是上帝 上帝造物的逻辑无需知道
    上帝想让你知道的你才能知道 这样就明确了等级
    2 通过继承 多态 在语言层面支持了归一化设计


    反射 1982年提出 指程序可以访问 检测 修改它本身状态或者行为的一种能力

    class BlackMedium:
        feture = 'ugly'
        def __init__(self,name,addr):
            self.name = name
            self.addr = addr
        def sell_house(self):
            print('%s 正在卖房子'%self.name)
    
    b1 = BlackMedium('万成置地','天露园')
    
    # print(getattr(b1,'name')) #返回内存地址或者内容
    # print(getattr(b1,'sell_house'))
    # print(hasattr(b1,'name')) #返回布尔值
    # print(hasattr(b1,'rent_house'))
    # print(setattr(b1,'sb',True)) #添加
    # print(b1.__dict__)
    # del b1.sb #delete
    # print(b1.__dict__)
    # setattr(b1,'func',lambda self:self.name + 'sb') #change
    # print(b1.func(b1))

    类内置的attr属性

    class Foo:
        x = 1
            def __init__(self,y):
            self.y = y
        def __getattr__(self,item):
            print('执行__getattr__')
        def __setattr__(self, key, value):
            Foo.__dict__[key] = value
            print('执行__getattr__')
        def __hasattr__(self,item):
            print('执行__getattr__')
        def __delattr__(self,item):
            print('bu执行__getattr__')
            print('no!!!!you can not')
    
    f1 = Foo(10)
    print(f1.y)
    print(getattr(f1,'y'))


    #只有在属性不存在时 自动触发gateattr
    # 删除属性时候会触发delattr
    # 设置属性时候会触发setattr

    继承方式完成包装

    class List(list):
    def append(self,p_object):
        if type(p_object) is str:
            super().append(p_object)
        else:
            print('only str can be add')
        def show_middle(self):
            mid_index = int(len(self)/2)
            return self[mid_index]
            pass
    # l2 = List('hello world')
    # print(l2,type(l2))
    l1 = List('helloworld')
    # print(l1,type(l1))
    # print(l1.show_middle())
    l1.append('abc')
    l1.append(1)
    print(l1)



    授权
    以组合方式加入

    import time
    class FileHandle:
        def __init__(self,filename,mode = 'r',encoding = 'utf-8'):
            self.file = open(filename,mode,encoding =encoding)
            self.mode =mode
            self.encoding = encoding
        def write(self,line):
            print('____>',line)
            t = time.strftime('%Y-%m-%d %X')
            self.file.write('%s %s'%(t,line))
        def __getattr__(self, item):
            return getattr(self.file,item)
    f1 = FileHandle('a.txt','r+')
    # print(f1.__dict__)
    # print("==>>",f1.read) #触发getattr
    f1.write('111111111
    ')
    f1.seek(0)
    # print(f1.read())
  • 相关阅读:
    求数组元素出现的次数
    数组的一些内置方法
    二维数组
    创建对象
    取出数组最大值与最小值
    4-jQuery
    3-jQuery
    2-jQuery
    1-jQuery
    Spark共享变量(广播变量、累加器)
  • 原文地址:https://www.cnblogs.com/louzhiyuan/p/10452206.html
Copyright © 2020-2023  润新知