【再回首Python之美】【类-内建函数】issubclass,isinstance,hasattr,getattr,setattr,delattr,dir,super,vars

类-内建函数

    服务于类以及对象。


9个内建函数

    issubclass,isinstance,hasattr,getattr,setattr,delattr,dir,super,vars

    注意:getattr()和delattr()可能抛出异常(如AttributeError),要结合try……expect来处理异常

    注意:使用hasattr来辅助getattr,setattr,delattr,先使用hasattr判断attr存在后再操作getattr,setattr,delattr,保证程序的健壮性等


如何使用?

    详见 示例代码


示例代码

#encoding:utf-8
#ex_class_builtin_method.py
self_file = __file__

#issubclass,isinstance
#hasattr,getattr,setattr,delattr
#dir,super,vars

#注意:getattr()和delattr()可能抛出异常(如AttributeError),要结合try……expect来处理异常

print "============================================================"
class CA(object):
    pass

class CB(CA):   #CB是CA的子类
    pass

class CC(CB):   #CC是CB的子类,CC也是CA的子类
    pass

class CD:
    pass

print "\n======issubclass(subclass, classes)======"
#issubclass(subclass, classes)
#返回值:bool
#classes可以是:int,float,bool,complex,str,list,dict,set,tuple
#如果subclass是classes的子类,则返回True
#如果subclass不是classes的子类,则返回False

print issubclass(CB, CA)        #True
print issubclass(CB, (CA, CD))  #True
print issubclass(CC, CA)        #True
print issubclass(CC, CB)        #True
print issubclass(CD, CA)        #False

print "\n======isinstance(instance, classinfo)======"
print isinstance(CB(), CB)       #True
print isinstance(CB(), CA)       #True
print isinstance(CB(), (CB, CD)) #True
print isinstance(CB(), CD)       #False

print "\n======isinstance(instance, classinfo)"
print isinstance(1,     int)    #True
print isinstance(1.0,   float)  #True
print isinstance(True,  bool)   #True
print isinstance(False, bool)   #True
print isinstance("Hi",  str)    #True
print isinstance(1+2j, complex) #True
print isinstance([1,2], list)   #True
print isinstance({1,2}, set)    #True
print isinstance((1,2), tuple)  #True
print isinstance({1:"1",2:"2"}, dict)#True
print isinstance(1, float)        #False
print isinstance(1, (int, float)) #True

print "============================================================"
print "\n======hasattr(instance, attr)====="
#返回值:bool
#如果instance有attr,则返回True,否则返回False
#instance-对象,
#attr-字符串,属性名

class CStudent(object):
    _ver = "Ver.1.0"
    def __init__(self, age):
        self.age = age
    def foo(self):
        pass
print hasattr(CStudent(16), "__dict__") #True
print hasattr(CStudent(16), "_ver")     #True
print hasattr(CStudent(16), "age")      #True
print hasattr(CStudent(16), "__init__") #True
print hasattr(CStudent(16), "foo")      #True

class CTeacher(object):
    pass
print hasattr(CTeacher(), "__init__") #False

class CPerson(object):
    def run(self):
        pass
class CWorker(CPerson):
    pass
print hasattr(CWorker(), "run") #True

print "\n======getattr(instance, attr[, default_ret])======"
#返回值:attrValue,defaultValue,错误异常AttributeError
#如果attr存在,则返回attr的数值
#如果提供了default_ret,attr不存在时,getattr会返回default_ret
#如果不提供default_ret,attr不存在时,getattr会触发异常AttributeError

print getattr(CStudent(16), "age")         #16
print getattr(CStudent(16), "age", False)  #16
print getattr(CStudent(16), "name",False)  #False
#print getattr(CStudent(16), "name")        #触发异常AttributeError: CStudent instance has no attribute 'name'

print "\n======setattr(instance, attr, value)======"
#返回值:None
#instance必须有attr属性
#设置instance的属性attr的数值为value
tom = CStudent(16)
print getattr(tom, "age")
setattr(tom, "age", 17)
print getattr(tom, "age")

setattr(tom, "_ver", "Ver.2.0")
print getattr(tom, "_ver") #Ver.2.0
print CStudent._ver        #Ver.1.0

#请不要对不存在的attr使用setattr!
print setattr(tom, "non-existent", 1) #None
print getattr(tom, "non-existent")    #1

print "\n======delattr(instance, attr)======"
#返回值:None,错误异常AttributeError
#删除instance的attr属性

tom = CStudent(16)
if hasattr(tom, "age"):             #True
    delattr(tom, "age")             #None
    print getattr(tom, "age", False)#False
    #print getattr(tom, "age")      #AttributeError: CStudent instance has no attribute 'age'
    #delattr(tom, "name")           #AttributeError: CStudent instance has no attribute 'name'
else:
    pass


print "============================================================"
class CMachine(object):#新式类
    def hello(self):
        print "invoke hello in CMachine"

class CThing(object):  #新式类
    def hello(self):
        print "invoke hello in CThing"

class CCar(CMachine, CThing):
    "I am CCar class"
    _ver = "1.0"
    def __init__(self, name, money):
        self.name = name
        self.money = money
    def hello(self):
        print "invoke hello in CCar"
    def TestSuper(self):
        super(CCar, self).hello()#super先从CCar.__mro__的父类集合中选择第一个有hello方法的父类,然后调用此父类的hello方法
print "\n======__mro__======"
print CCar.__mro__#(<class '__main__.CCar'>, <class '__main__.CMachine'>, <class '__main__.CThing'>, <type 'object'>)

print "\n======dir()======"
print dir(CCar)
print dir(CCar("BYD", 16))

print "\n======super======"
car = CCar("BYD", 16)
car.TestSuper()

print "\n======vars======"
print vars(CCar)

print "\n======__dict__======"
print CCar.__dict__

print "\n======__mro__======"
class CAnimal:  #经典类
    def hello(self):
        print "invoke hello in CAnimal"
class CMagic:   #经典类
    def hello(self):
        print "invoke hello in CThing"
class CMonkey(CAnimal, CMagic):
    def  TestSuper(self):
        pass
        #super(CMonkey, self).hello() #TypeError: super() argument 1 must be type, not classobj
        #说明经典类已经不支持super函数

print "\nexit %s" % self_file

编译执行

============== RESTART: C:\Python27\ex_class_builtin_method.py ==============
============================================================

======issubclass(subclass, classes)======
True
True
True
True
False

======isinstance(instance, classinfo)======
True
True
True
False

======isinstance(instance, classinfo)
True
True
True
True
True
True
True
True
True
True
False
True
============================================================

======hasattr(instance, attr)=====
True
True
True
True
True
True
True

======getattr(instance, attr[, default_ret])======
16
16
False

======setattr(instance, attr, value)======
16
17
Ver.2.0
Ver.1.0
None
1

======delattr(instance, attr)======
False
============================================================

======__mro__======
(<class '__main__.CCar'>, <class '__main__.CMachine'>, <class '__main__.CThing'>, <type 'object'>)

======dir()======
['TestSuper', '__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_ver', 'hello']
['TestSuper', '__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_ver', 'hello', 'money', 'name']

======super======
invoke hello in CMachine

======vars======
{'__module__': '__main__', 'TestSuper': <function TestSuper at 0x0000000002E0BC88>, '_ver': '1.0', 'hello': <function hello at 0x0000000002E0BC18>, '__init__': <function __init__ at 0x0000000002E0BBA8>, '__doc__': 'I am CCar class'}

======__dict__======
{'__module__': '__main__', 'TestSuper': <function TestSuper at 0x0000000002E0BC88>, '_ver': '1.0', 'hello': <function hello at 0x0000000002E0BC18>, '__init__': <function __init__ at 0x0000000002E0BBA8>, '__doc__': 'I am CCar class'}

======__mro__======

exit C:\Python27\ex_class_builtin_method.py
>>> 
(end)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值