python的反射函数(hasattr()、getattr()、setattr()与delattr())和类的内置属性attr(__getattr()__、__setattr()__与__delattr()__)

主要是指程序可以访问、检测和修改它本身状态或行为的一种能力(自省),有四个可以实现自省函数。

hasattr(object,name) 判断object中是否有name字符串对应的属性或方法,返回True或False

getattr(object,name[,defaultreturn])获取object中name字符串对应属性的值,没有这个属性的话会报错,defaultreturn表示如果没有对应的属性返回默认的设定值而不会报错

setattr(object,key,value)表示修改object中key对应的属性的值为value,object中存在key属性则修改它的值,不存在则增加这个属性。

delattr(object,key) 删除object中key对应的属性

class cat:
    living='earth'
    def __init__(self,name,leg,tail):
        self.name = name
        self.leg = leg
        self.tail = tail
    def eat(self,food):
        print('%s likes to eat %s'%(self.name,food))
cat1=cat('cat1',4,1)
print(hasattr(cat1,'leg'),hasattr(cat1,'eat_food'))
print(getattr(cat1,'tail'),getattr(cat,'eat_food','none searching attribute'))
setattr(cat1,'leg',3)
setattr(cat1,'func',lambda x:x+3)
print(cat1.__dict__)
delattr(cat1,'func')
print(cat1.__dict__)

# 输出如下:
# True False
# 1 none searching attribute
# {'name': 'cat1', 'leg': 3, 'tail': 1, 'func': <function <lambda> at 0x0000029D0341A6A8>}
# {'name': 'cat1', 'leg': 3, 'tail': 1}

类的内置属性__getattr()__、__setattr()__与__delattr()__

获取的属性不存在时,会触发类的内置__getattr()__方法(获取属性时,属性存在会触发__getattribute()__方法,不存在则__getattribute()__抛出AttributeError异常,并触发__getattr()__方法)

给实例或者类增加或修改属性时、或者执行delattr(),会触发类的内置__setattr()__方法

删除属性、或者执行delattr()时,会触发类的内置__delattr()__方法

内置属性__getitem()__、__setitem()__与__delitem()__,意义与上面的attr类似

不同之处在于,通过实例.属性时触发的是attr,通过实例[属性]时触发的是item

isinstance(obj,cls) 判断obj是否是cls的对象,如果B是A的子类,C是B的实例,那么c也是A的对象

issubclass(sub,super)判断sub是否是super的子类,如果B是A的子类,C是B的子类,那么C也是A的子类

原文地址:https://www.cnblogs.com/Forever77/p/10093605.html