zoukankan      html  css  js  c++  java
  • type()、获取对象信息

    1.判断对象类型 type()

    type(obj)返回对线类型如:
    type(1)     #<class 'int'>
    type('a') #<class 'str'>
    func():
        return ('this is a function')
    type(func)  #<class 'function'>

    2.和 isinstance()区别

    class Father():
        pass
    class Child(Father):
        pass
    
    isinstance(Child(),Father)#子类也是父类的实例  返回True
    type(Child())==Father # 子类不属于父类类型  返回False

    3.type的另外一个作用,动态生成类

    class A():
        def say():
            return ('function say')
    
    type(A())#<class '__main__.A'>
    type(A)#<class 'type'>

    我们发现type(A)输出的是type类型,python动态语言中的类是在运行时候创建的,而创建class的方法就是type()方法
    python中类创建的本质:
    我们使用class创建类,当你使用class关键字时,Python解释器自动创建这个对象。而底层其实使用的是type函数(type函数也可以查看实例所属类型)来创建类的。所以我们可以直接使用type()函数来手动实现动态创建类。
    type()创建类的语法为:
    类名 = type('字符串类型,同类名',(继承关系,元祖类型),{字典类型,放类的方法 和类属性})
    举例说明:

    class Person():
        def per(self):
            return('这是Person类中的per方法')
    class Test_obj():
        def func1(self):
            return('另外的一个func1函数')
    # Student=type('Student',(Person,),dict(say=Test_obj().func1))
    Student=type('Student',(Person,),{'say':Test_obj().func1,'name':'jack'})
    stu=Student()
    print(stu.per())#这是Person类中的per方法
    print(stu.say())#另外的一个func1函数
    print(stu.name)#jack    

    这个动态生成的类等同于:

    class Student(Person):
        name = 'jack'
        def say(self):
            return('另外的一个func1函数')

    4.hasattr getattr setattr

    其实我们也不用像上述代码那样子 一个一个打印出来来验证申明的类中是否有这些属性.

    查看是否含有某个属性,可以用 hasattr(obj,attr)

    接上述代码:

        hasattr(Student,'per')  #True
        hasattr(Student,'name')#True
        hasattr(Student,'say')#True

    当传一个没有的属性时,返回False

      hasattr(Student,'score')#False

    获取某个属性,可以用getattr(obj,attr)

        getattr(Student,'name') #jack
        getattr(Student,'per')#<function Person.per at 0x000001FE7208D948> 返回这个函数    

    当试图获取一个没有的属性的时候,报错

      getattr(Student,'score')#报错没有属性score

    当然我们一般都是直接去obj.attr 去获取属性,没必要去getattr,hasattr但是当我们不知道对象信息的时候,getattr就起作用了,如:

    def readImage(fp):
      if hasattr(fp, 'read'):
         return readData(fp)
      return None

    假设我们希望从文件流 fp 中读取图像,我们首先要判断该 fp 对象是否存在 read 方法,如果存在,则该对象是一个流,如果不存在,则无法读取。hasattr()就派上了用场。根据鸭子类型,有 read()方法,不代表该 fp 对象就是一个文件流,它也可能是网络流,也可能是内存中的一个字节流,但只要 read()方法返回的是有效的图像数据,就不影响读取图像的功能。

    当然我们也可以去setattr手动给某个类添加属性 :setattr(objname,attrname,attr)

    还是接上述动态生成的Student类 如:

        setattr(Student,'score',100)
        hasattr(Student,'score')  #True
        def func2(self):
            return ('func2')
        setattr(Student,'func2',func2)
        Student().func2()    #返回func2

    当setattr一个属性和之前本来就存在的属性同名的时候,直接覆盖原来的属性

  • 相关阅读:
    Tomcat6.0 sqlServer2000 配置连接池操作
    SQL GROUP BY 实例
    Java 获取当前系统时间 格式:yyyyMMdd HH:mm:ss
    银行科技与业务融合之道
    银行IT部门科技管理流程管控工作发展之路
    银行科技管理工作优化提升之我见
    事务脚本的缺点以及领域模型的优点
    异常的分级分类与处理策略
    软件高性能的思考
    软件行业的一个发展推力就是不断提高用来构造软件的基础元素,也就是所谓的编程模型
  • 原文地址:https://www.cnblogs.com/alantammm/p/13685520.html
Copyright © 2011-2022 走看看