一、内置函数isinstance和issubclass。
1.总结python内置函数 isinstance。
isinstance 是python中的内置函数,可以用来判断一个对象是否是已知的内容。
l = list([1, 2, 3])print(type(l))print(isinstance(l, list))print(isinstance(l, tuple)) 上面代码会输出下面结果:
<class ‘list‘>
True
False
通过输出结果可以看出来,isinstance可以判断对象‘l’ 的类型是不是‘list’,当判断‘l’的类型是list的时候会输出True,反之就会输出False。
2.总结python内置函数issubclass。
Python的ctypes库中提供了一个接口来查询是不是其个类的子类。
class A: passclass B(A): passprint(issubclass(B, A))print(issubclass(A, B)) 上面代码会输出下面结果:
True
False
代码中使用issubclass判断类B是否是类A的子类时,输出结果为True,当判断A是否是B的子类时,输出结果是False。
二、反射
1.反射即想到4个内置函数分别为:getattr、hasattr、setattr、delattr 获取成员、检查成员、设置成员、删除成员下面逐一介绍先看例子:
class People: def __init__(self, name): self.name = name def walk(self): print(‘walk‘)
p = People(‘yh‘) #实例化运行下面代码:print(getattr(p, ‘name‘)) #获取成员print(hasattr(p, ‘walk‘)) #检查成员setattr(p, ‘age‘, 18) #设置成员setattr(p, ‘id‘, 1)print(p.age)delattr(p, ‘id‘) #删除成员输出结果:
yh
True
18
将添加的属性‘id’ 删除,然后在输出会报错:
AttributeError: ‘People‘ object has no attribute ‘id‘
2.反射
(1).根据字符串的形式导入模块。
_import_(‘模块名‘)
或者
import importlib
t = importlib.import_moudle(‘模块名‘)
(2).根据字符串的形式去对象(某个模块)中操作其成员
三、内置attr:__getattr__,__setattr__,__delattr__
__setattr__、__getattr__和__delattr__可以拦截对对象属性的访问。
_getattr_:当一个属性在通常的位置没有被找到的时候会被自动调用(如,一个既不是实例本身的属性,又没有通过self在class tree中找到的属性)。返回属性值或者抛出AttributeError。
_setattr_:当给一个属性设置值的时候会调用的函数。
_setattr_:当删除一个属性的时候会调用。
使用以下代码来演示:
class Foo: def __init__(self,name): self.name = name def __setattr__(self, key, value): self.__dict__[key] = value def __delattr__(self, item): self.__dict__.pop(item) def __getattr__(self, item): print(‘%s‘%item)f = Foo(‘yh‘) #会触发 _setattr_的操作,会将‘name‘:‘yh‘加入到 _dict_中f.age = 18 #会触发_setattr_的操作,会将‘age‘:‘18‘加入到_dict_中del f.age #会触发_delattr_的操作,会将‘age‘:‘18‘从_dict_中删掉f.ss #会触发_getattr_的操作,会打印‘ss’ 四、定制自己的数据类型:1.继承的方法:
class List(list): def pop(self, index=None): if index >5: raise TypeError("don‘t delete") else: super().pop(index) 代码中List类继承了list类,在List类中定义当索引值大于5时,提示不让删除,其它的情况继承list的方法来实现。 2.授权的方式
import timeclass Open: def __init__(self, file, m=‘r‘, encod=‘utf8‘): self.file = file self.mode = m self.encoding = encod self.x = open(file, mode=m, encoding=encod) def write(self,value): t = time.strftime(‘%Y-%m-%d %X‘) self.x.write(‘%s %s‘%(t, value)) def __getattr__(self, item): return getattr(self.x, item)o = Open(‘a‘,‘w‘)o.write(‘1111\n‘) #触发 write 操作,将当前时间以及‘1111’添加到文件a中r = Open(‘a‘,‘r+‘)print(r.read) #触发 _getattr_操作