# instance、issubclass 、getattrbute的用法

# class Foo:
#     pass
# f1=Foo()
# #判断实例f1是否是Foo的实例
# print(isinstance(f1,Foo))
# #判断类Bar是否从Foo的继承过过来的
# class Bar(Foo):
#     pass
# print(issubclass(Bar,Foo))
# b1=Bar()
# print(isinstance(b1,Bar))   #True
# print(isinstance(b1,Foo))   #True
# print(type(b1))      #<class '__main__.Bar'>


# getattrbute 不能有没有找到指定的变量或函数,都会执行getattrbute,而不会去执行getattr
# class Foo:
#     def __init__(self,x):
#         self.x=x
#     def __getattr__(self, item):
#         print('执行的是getattr...')
#
#     def __getattribute__(self, item):
#         print('执行的是getattrbute...')
##自定义:抛出异常,可以结束getattrbute,再跳到getattr,如果不定义函数会在此处结束掉,相当于程序奔溃
#         raise AttributeError('抛出异常了')
#
# f1=Foo(10)
# f1.x   #存在的时候
# f1.ee  #不存在的时候