• 面向对象编程多种特性


    多态概念

    对象通过他们共同的属性和动作来操作及访问,而不需考虑他们具体的类。
    多态表明了动态绑定的存在,以及重载及运行时类型确定和验证

    封装

    约定:

    • 使用_(一个单下划线开头的是对外部不可见的)
    • 使用__(双下划线开头的,在类外面调用python自动重命名,在内部调用可直接调用)
    __start = 'xxx'
    #重命名成_People__start
    

    反射(动态导入后台基于反射来进行的)

    • hasattr
    • getattr
    • setattr
    • delattr

    在调用前判断方法是否已经完成

    f1 = FtpClient('1.1.1.1')
    if hasattr(f1,'get'):
        func_get=getattr(f1,'get')
        func_get()
    else:
        print('方法不存在')
    

    类内置attr属性

    __getattr__在类中调用不存在的函数的时候执行
    __delattr__在删除的时候执行
    setattr 在设置类属性的时候执行(在setattr中不执行设置值的操作,可改成 self.dict[key] = value)

    getattr属性不存在时触发

    class Foo:
        def __init__(self,name):
            self.name = name
    
        def __getattr__(self, item):
            print("调用attr函数%s" %item)
    
    f1 = Foo('alex')
    print(f1.name)
    print(f1.age)
    '''
    alex
    调用attr函数age
    None
    '''
    

    setattr在属性设置的时候设置属性字典

    class Foo:
        def __init__(self,name):
            self.name = name
    
        def __setattr__(self, key, value):
            print("执行setattr",key,value)
            if type(value) is str:                #对数据属性进行类型检查。
                print('开始设置')
                self.__dict__[key]=value
            else:
                print('必须要字符串类型才行')
    
    f1 = Foo('alex')
    f1.age=19
    print(f1.__dict__)
    '''
    执行setattr name alex
    开始设置
    执行setattr age 19
    必须要字符串类型才行
    {'name': 'alex'}
    '''
    

    delattr在属性删除时触发

    class Foo:
        def __init__(self,name):
            self.name = name
    
        def __delattr__(self, item):
            print("执行delattr",item)
            self.__dict__.pop(item)
    
    f1 = Foo('alex')
    f1.age=19
    print(f1.__dict__)
    del f1.age
    print(f1.__dict__)
    '''
    {'name': 'alex', 'age': 19}
    执行delattr age
    {'name': 'alex'}
    '''
    

    包装

    对功能进行继承

    通过此功能可以对已有的功能进行限制开放,也可以进行定制“如限制关键字”
    对已经存在的特性进行定制,例如对文件操作对象进行修改通过getattr方法获取到类已有的属性

    class Open:
        def __init__(self,file,mode='w',encoding= 'utf-8'):
            self.file = open(file,mode,encoding=encoding)
            self.mode = mode
            self.encoding = encoding
    
        # def open(self):
        #     pass
        def __getattr__(self, item):
            print("getattr exec")
            return getattr(self.file,item)
    
    
    a = Open('a.txt','w',encoding='utf-8')
    a.write('axcdf')
    '''
    getattr exec
    '''
    

    对文件的write方法进行改写

    import time
    class Open:
        def __init__(self,file,mode='w',encoding= 'utf-8'):
            self.file = open(file,mode,encoding=encoding)
            self.mode = mode
            self.encoding = encoding
    
        # def open(self):
        #     pass
        def __getattr__(self, item):
            print("getattr exec")
            return getattr(self.file,item)
        def write(self,line):
            tt = time.strftime('%Y-%m-%d %X')
            self.file.write('%s %s' %(tt,line))
    
    
    a = Open('a.txt','w',encoding='utf-8')
    a.write('axcdf')
    
  • 相关阅读:
    每日站立会议08
    MAVEN常用命令
    android开发环境搭建
    阻止默认事件和阻止事件冒泡
    C#ActiveX安装项目
    System&Software
    poj 1386 Play on Words 有向欧拉回路
    poj 1033
    120.Triangle
    pandas中 transform 函数和 apply 函数的区别
  • 原文地址:https://www.cnblogs.com/chrrydot/p/9821376.html
Copyright © 2020-2023  润新知