多态概念

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

封装

约定:

  • 使用_(一个单下划线开头的是对外部不可见的)
  • 使用__(双下划线开头的,在类外面调用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')
posted on 2018-10-20 13:32  cherrydot  阅读(160)  评论(0编辑  收藏  举报