反射 19

 一  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)信息

      

  

猜你喜欢

转载自www.cnblogs.com/f-g-f/p/9721200.html
19