python---issubclass/type/isinstance/ 反射(内置函数getattr/delattr...)

# 一 python面向对象-内置函数(issubclass(), type(), isinstance())
# issubclass 判断xxxx类是否是xxxx类的子类
class egg:
    pass
class eegg(egg):
    pass
class yuneegg(eegg):
    pass

dan = egg()
edan = eegg()
shouyunedan = yuneegg()

print(issubclass(eegg, egg)) # True 鹅蛋继承蛋的属性,是子类
print(issubclass(yuneegg,egg)) # True .受孕鹅蛋也是蛋的子类,都都蛋蛋
print(issubclass(eegg, yuneegg)) # False 鹅蛋也有没受孕的

# type 给出xxx的数据类型. 给出创建这个对象的类
print(type(dan) and type(edan)) # False 返回创建他的类,不找子类或者父类,只找创造的类


# isinstance 判断xxx对象是否是xxx类型的 判断是不是一个类的体系,只找直系向上的,不找分支和子类
print(isinstance(dan, egg)) # True ,有蛋创建的
print(isinstance(edan,egg)) # True ,鹅蛋也是单,是他的子类
print(isinstance(shouyunedan, egg)) # TRUE受孕鹅蛋还是蛋,可以找祖宗
print(isinstance(dan, eegg)) #  FALSE  蛋不一定是鹅蛋,也许是鸭蛋

# 二 2. 如何分辨方法和函数.
#         在类外面定义的函数一定是函数
#         在类中:
#             1. 实例方法: 如果是对象访问.方法,, 如果是类名访问是函数
#             2. 静态方法: 都是函数
#             3. 类方法: 都是方法
#         如果想要用程序来判断. 需要引入两个模块
#         from types import FunctionType, MethodType
#         isinstance()
from  types import  FunctionType,MethodType
class Animal:
    def __init__(self, kemu, xueming):
        self.kemu = kemu
        self.xueming = xueming
    def add(self):
        return self.kemu + self. xueming
tiger = Animal("cat", "oldhu")

print(isinstance(tiger.add, FunctionType))
print(isinstance(tiger.add, MethodType))


# 三
# 反射(重点)
# 仅限于内存层面(函数执行不改变源文件,只修改内存加载的信息)
# 重点:
# hasattr(obj, str)判断对象中是否包含了xxx(str)
import handler
a = hasattr(handler, "Base") #存在True, 不存在FALSE
b = hasattr(handler, "ali") #False
print(a)
print(b)

# getattr(obj, str)从对象中获取xxxx(str)
c = getattr(handler, "Base") # 存在返回Base变量
# qita = getattr(handler, "aad")# 不能存在报错
c()

# 次重点:
# setattr(obj, str, value) 给对象设置xxxx(str)属性值(value)
setattr(handler, "t", 12) # 不存在执行新增,存在执行修改变量t
print(handler.t)

# delattr(obj, str)从对象中删除xxxxx(str) 信息
delattr(handler,"t") # 删除变量t
delattr(handler,"xxx") # 不存在报错
print(handler.t)

猜你喜欢

转载自www.cnblogs.com/tcpblog/p/9721187.html