首页 > 代码库 > day31-python作业
day31-python作业
一、内置函数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:
pass
class B(A):
pass
print(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 time
class 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_操作
day31-python作业