一 issubclass , type , isinstance
1.issubclass 判断xxx类是否是xxxx类的子类
class Base: pass class Foo(Base): pass class Bar(Foo): pass print(issubclass(Bar,Foo)) # True 判断Bar是不是Foo的子类 前者继承后者,是 print(issubclass(Foo,Bar)) # False 前者被后者继承 返回值是False print(issubclass(Bar,Base)) # True 前者继承 继承的继承 因此是True
2.type 给出 xxx 的数据类型 比较精准的给出对象的类
type type(obj) 表示查看obj是由哪个类创建的
class Foo: pass obj = Foo() print(obj,type(obj)) #<__main__.Foo object at 0x00000289C760D198> <class '__main__.Foo'>
前边的表示由Foo创建的一个具体的对象所在的内存地址 后者表示obj 属于Foo类.(给出创建这个对象的类可以精准判断,这点有别于isinstance)
3.isinstance 迭代器 判断xxx对象是否是xxxx类型的 子类的对象可以当成父类的类型 (不能往下判断 即父类对象当成子类的类型)
class Base: pass class Foo(Base): pass class Bar(Foo): pass print(isinstance(Foo(),Foo)) # True 自己属于自己的类型 print(isinstance(Foo(),Base)) # True 继承了Base 因此属于Base类型 print(isinstance(Foo(),Bar)) # False 不能往下判断
# 实例方法: 对象.方法 方法 类名.方法
二 区分函数和方法(不太重要):
在外面定义的函数一定是函数
在类中:
1.实例方法: 如果是对象访问 那么就是方法 如果是类访问 , 那么就是函数
2. 静态方法 : 都是函数
3. 类方法 : 都是方法
如果想要用程序来判断. 需要引入两个模块
from types import FunctionType , MethodType
isinstance(obj , FunctionType) 返回True 或者False
三 反射(重点)
正常是先引入模块,然后去访问模块里的内容,现在反了 手动输入要运行的功能,反着去模块里找,这个就是反射.
仅限于内存层面 并不会影响源代码 如果想改,可以使用文件操作进行修改
hasattr(obj,str) 判断对象中是否包含了 xxx(str)
getattr(obj,str) 从对象中获取xxxx(str)
setattr(obj,str,value) 给对象设置xxx(str)属性值(value)
delattr(obj,str) 从对象中删除xxxx(str)信息