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
原文地址:https://www.cnblogs.com/Mister-JH/p/9526474.html