首页 > 代码库 > 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作业