zoukankan      html  css  js  c++  java
  • isinstance,issubclass,反射,内置方法(__str__,__del__,__call__)

    一、isinstance和issubclass

      Isinstance的用法是用来判断一个量是否是相应的类型,接受的参数一个是对象加一种类型。是用于判断一个对象是否是一个类的实例的函数。

    例:

    class Bar:
        pass
    
    class Bar(Foo):
        pass
    
    
    print(isinstance(obj,Foo))   # 可以判断对象是否为Foo类的实例化
    print(isinstance([1,2,3],list))  # 还可以判断是否是某种类型

      使用issubclass判断一个类是否是另外一个类的派生类,正确返回True错误返回False

    例:

    class Foo:
        pass
    
    class Bar(Foo):
        pass
    
    obj = Foo()
    
    
    print(issubclass(Foo,Bar))  # 判断是否子类

    二、反射(hasattr、getattr、setattr、delattr)

      反射:通过字符串的形式操作对象相关的属性,python中的一切事物都是对象,用字符串取代点(.)对属性的操作

      hasattr(object,name): 判断object中有没有一个name字符串对应的方法或属性

    print(hasattr(obj,'name'))   # 等同于  'name'  in obj.__dict__

      setattr(object,x,y): 为对象一个属性

    setattr(obj,'name','sql')   # 等同于  obj.__dict__['name']='sql'
    
    setattr(obj,'xxx',123)     # 等同于  obj.__dict__['xxx']=123

      getattr(object,name,default): 获得对象name属性的值,不声明default时不存在该属性会报错 

    print(getattr(obj,'name'))   #  等同于 obj.__dict__['name']

      delattr(object,name): 删除对象的name属性

    delattr(obj,'name')  # del obj.name

    三、内置方法

      1、__str__:在对象被打印时自动触发,可用来定义对象被打印。

      注意:返回必须是一个字符串类型的值

    class People:
    
        def __init__(self, name, age):
    
            self.name = name
    
            self.age = age
    
     
    
        def __str__(self):
    
            return '<name:%s age:%s>'%(self.name,self.age)
    
     
    
    obj1 = People('sql', 18)
    
    print(obj1)                 #打印 <name:sql age:18>

      2、__del__在对象被删除时先自动触发该方法,可以用来回收对象以外的其他相关资源,比如系统资源。

    class Foo:
    
        def __init__(self, x, filepath, encoding='utf-8'):
    
            self.x = x
    
            self.f = open(filepath, 'rt', encoding=encoding)
    
            
        def __del__(self):
    
            # 回收对象关联的其他资源
    
            self.f.close()
    
     
    obj = Foo(1, 'a.txt')

      3、__call__: 对象通过提供__call__(slef, [,*args [,**kwargs]])方法可以模拟函数的行为,如果一个对象x提供了该方法,就可以像函数一样使用它,也就是说x(arg1, arg2...) 等同于调用x.__call__(self, arg1, arg2) 。模拟函数的对象可以用于创建防函数(functor) 或代理(proxy).

    class Foo(object): 
    def __call__(self):
        pass

    f = Foo() # 类Foo可call
    f() # 对象f可call
  • 相关阅读:
    RabbitMQ集群
    RabbitMQ (十六) 消息队列的应用场景 (转)
    RabbitMQ (十五) 镜像集群 + HAProxy1.7.8 负载均衡
    RabbitMQ (十四) 普通集群
    RabbitMQ (十三) 集群+单机搭建(window)
    秋招_微盟_一面/二面/HR面
    秋招-腾讯云西子公司-一二面-11/16
    秋招-京东(补录)-面经-一面/二面/HR面
    秋招-腾讯补录-面经-12/10
    投递过程
  • 原文地址:https://www.cnblogs.com/Mister-JH/p/9526474.html
Copyright © 2011-2022 走看看