多态概念
对象通过他们共同的属性和动作来操作及访问,而不需考虑他们具体的类。
多态表明了动态绑定的存在,以及重载及运行时类型确定和验证
封装
约定:
- 使用_(一个单下划线开头的是对外部不可见的)
- 使用__(双下划线开头的,在类外面调用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')