一:isinstance、issubclass
isinstance(obj,class),检查实例是不是类的对象
class A:
pass
a = A()
isinstance(a, A) >>> True
issubclass(sub, super),检查sub是否是super类的派生类
class A:
pass
class B(A):
pass
issubclass(B,A) >>> True
二:反射
#在python中,一切皆对象,由以下4个内置函数实现
# hasattr : 检查一个对象是否有其方法或属性等
# getattr :获取对象方法或者属性等
# setattr :设置对象方法或者属性等
# delattr :删除对象属性或者方法等
class A:
num = 13
def __init__(self, name,age):
self.name = name
self.age = age
def test(self):
print('输出了')
a_obj = A('tom',21)
# 检查是否含有某些属性
hasattr(a_obj, 'name') >>> True
hasattr(a_obj, 'test') >>> True
#获取属性:
test = getattr(a_obj, 'name') >>> tom
test = getattr(a_obj, 'test')() >>> 调用了test()
#设置
setattr(a_obj,'sex','man') >>设置了 sex 属性
setattr(a_obj,'result', lambda self:self.num + 1) >>设置了一个匿名函数
# 删除属性
delattr(a_obj,'sex')
delattr(a_obj,'result')
#类也是对象
getattr(A, 'num')
getattr(A, 'test')
#反射当前模块的成员
import sys
def a():
pass
def b():
pass
modul = sys.modules[__name__]
getattr(modul, 'a')
hasattr(modul,'b')
三:__setattr__ , __delattr__ , __getattr__
#__setattr__ :当添加或者修改的时候,自动触发
#__delattr__ :当删除属性的时候,自动触发
#__getattr__ :当找不到属性的时候,自动触发
class A:
def __init__(self, name):
self.name = name
def __getattr__(self, item):
print('找不到了吧,我运行了')
def delattr(self, item):
#del self.item 这么做是不对的,会无限的触发这个函数,等同于递归了
self.__dict__pop(item) #这样做才是对的
def __setattr__(self, key, value):
# slef.key = value 这么做是不对的,会无限的触发这个函数,等同于递归了
self.__dict__[key] = value
# 触发 __setattr__
a = A('tom')
a.x = 50
#触发 __delattr__
del a.name
#触发__getattr__
a.abcde
四:重新加工Python的标准类型
class List(list);
def append(self, number):
try:
if number.isdigit():
pass
elif type(number) in int:
super().append(number)
else:
raise TypeError('该数值既不是数字型字符串也不是int型数值')
except Attribute:
super().append(int(number))
@propety
def start(self):
return self[0]
@propety
def end(self):
return self[len(self) - 1]
l = List([1,2,3])
l.append('2') # 会将字符2转换成int,再添加进列表里
print(l) >>> 1,2,3,2
l.clear() #由于继承了List类,所以拥有这个方法
加上权限限制1:
class List(list);
def __init__(self,lists, status=False)
super().__init__(self,lists)
self.status = status
def append(self, number):
try:
if number.isdigit():
pass
elif type(number) in int:
super().append(number)
else:
raise TypeError('该数值既不是数字型字符串也不是int型数值')
except Attribute:
super().append(int(number))
@propety
def start(self):
if self.status in False:
raise TypeError('没有权限操作')
return self[0]
@propety
def end(self):
return self[len(self) - 1]
l = List([1,2,3])
#l.statr 没有权限,抛异常
l.status = True
l.start #成功运行
加上权限限制2:
class List;
def __init__(self, item, authority=False):
self.item = item
slef.authority = authority
def append(self,num):
if self.authority in False:
raise PermissionError('没有权限这么做')
self.item.append(num)
def __getattr__(self, mem):
return getattr(self.item, mem)
def __str__(self): # 这个函数会被print()函数触发,自动运行。只用于显示
return str(self.item)
l = List([1,2,3])
#l.append(4) #没有权限这么做
l.authority = True
l.append(4) #成功
print(l)
l.clear()
---恢复内容结束---