类-内建函数
服务于类以及对象。
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)