• python摸爬滚打之day18----instance, type, issubclass和反射


    1、issubclass(a,b)  ----> 判断a是否是b的子类.

       isinstance(a,b)  ----> 判断a这个对象是否是b类型的(可以向上判断, 即考虑继承关系往父类判断)

       type(a)  ----> 获取到a对象的类型, type是不考虑继承关系的.

     1 class Animal:
     2     pass
     3 class Cat(Animal):
     4     pass
     5 class LanCat(Cat):
     6     pass
     7 
     8 c = Cat()
     9 l = LanCat()
    10 print(isinstance(Cat(),Animal))    #  True  判断前者是否是后者的一个对象
    11 print(issubclass(Cat,Animal))     #  True  判断cat是不是animal的子类
    isinstance

    2、区分函数和类的成员方法

      结论: 1, 对象访问的, 就是方法; 类名访问的, 就是函数;

           2, 对于静态方法, 都是函数;

           3, 对于类方法, 都是方法(任何类其实都是type类的对象,即对象访问)

      from types import FunctionType, MethodType

      print( isinstance(xxx, FunctionType) )

      print( isinstance(xxx, MethodType) )

    3、反射 

      通过字符串的形式从对象中动态的获取成员.

         hasattr(obj,str) ----> 判断obj中是否有str成员(最常用)

      getattr(obj,str) ----> 从obj中获取str成员(最常用)

      setattr(obj,str,new) ----> 将obj中的str进行重写, 重写内容为new内容

      delattr(obj,str) ----> 删除obj中的str成员

      说明:

        以上操作都是对内存中的文件进行修改的, 并不会影响源代码.

     1 class Base:
     2     base = "父类的"
     3     def chi(self):
     4         print("吃的开心")
     5     def he(self):
     6         print("喝的好撑")
     7 
     8 class Sclass(Base):
     9     son = "子类的"
    10     def __init__(self,name):
    11         self.name = name
    12     def wan(self):
    13         print("玩得舒服")
    14 p = Sclass("防滑链")
    15 
    16 print(getattr(p,"name"))
    17 print(getattr(p,"son"))
    18 print(getattr(Sclass,"son"))
    19 print(getattr(p,"base"))
    20 print(getattr(Base,"base"))
    21 
    22 print(getattr(p,"wan"))         # 从对象里找,找到的是wan()方法的内存地址
    23 print(getattr(Sclass,"wan"))    # 从类里找,找到的是wan()函数的内存地址.
    24 print(getattr(p,"wan")())
    25 
    26 # 如果想反射到别的.py文件,就必须导入 "import py文件名" ,getattr(py文件名.类名,str)
    反射

      反射的另类用法: 通过字符串导入模块(原理不是反射, 只是有步骤用到了反射)

    1 path = "字符串导入模块.example.fanshe"      # 模块路径
    2 import importlib
    3 inp = input("请输入要查看的类别[f1,f2,f3]: ")
    4 m = importlib.import_module(path)       # 通过字符串的形式来导入模块
    5 if hasattr(m.Cate,inp):     #  m.Cate, 即inp是否在类的成员方法里面, 不能写直接写m, 找不到的
    6     obj = m.Cate()          #  创建obj对象
    7     print(getattr(obj,inp)())
    8 else:
    9     print("不存在此类别.")
    通过字符串导入模块
  • 相关阅读:
    Windows下的免安装版MySQL配置
    spket插件安装并设置JQuery自动提示
    js生成条形码——JsBarcode
    金明的预算方案
    文化之旅
    方格取数
    天使的起誓
    最大差值
    A%B Problem
    取数游戏
  • 原文地址:https://www.cnblogs.com/bk9527/p/9936390.html
Copyright © 2020-2023  润新知