1,isinstance和issubclasspython
isinstance(obj,cls)檢查是否obj是不是類 cls 的對象ide
class Foo(object):
pass
obj = Foo()
isinstance(obj, Foo)
issubclass(sub, super)檢查sub類是不是 super 類的派生類 函數
class Foo(object):
pass
class Bar(Foo):
pass
issubclass(Bar, Foo)
2,反射 ui
2.1, 什麼是反射spa
反射的概念是由Smith在1982年首次提出的,主要是指程序能夠訪問、檢測和修改它自己狀態或行爲的一種能力(自省)。這一律唸的提出很快引起了計算機科學領域關於應用反射性的研究。它首先被程序語言的設計領域所採用,並在Lisp和麪向對象方面取得了成績。設計
python面向對象中的反射:經過字符串的形式操做對象相關的屬性。python中的一切事物都是對象(均可以使用反射)rest
反射 : 是用字符串類型的名字 去操做 變量code
2.2,四個實現反射的函數對象
def hasattr(*args, **kwargs): # real signature unknown
""" Return whether the object has an attribute with the given name. This is done by calling getattr(obj, name) and catching AttributeError. """
pass
def getattr(object, name, default=None): # known special case of getattr
""" getattr(object, name[, default]) -> value Get a named attribute from an object; getattr(x, 'y') is equivalent to x.y. When a default argument is given, it is returned when the attribute doesn't exist; without it, an exception is raised in that case. """
pass
def setattr(x, y, v): # real signature unknown; restored from __doc__
""" Sets the named attribute on the given object to the specified value. setattr(x, 'y', v) is equivalent to ``x.y = v'' """
pass
def delattr(x, y): # real signature unknown; restored from __doc__
""" Deletes the named attribute from the given object. delattr(x, 'y') is equivalent to ``del x.y'' """
pass
class Foo: f = '類的靜態變量'
def __init__(self,name,age): self.name=name self.age=age def say_hi(self): print('hi,%s'%self.name) obj=Foo('egon',73) #檢測是否含有某屬性
print(hasattr(obj,'name')) print(hasattr(obj,'say_hi')) #獲取屬性
n=getattr(obj,'name') print(n) func=getattr(obj,'say_hi') func() print(getattr(obj,'aaaaaaaa','不存在啊')) #報錯
#設置屬性
setattr(obj,'sb',True) setattr(obj,'show_name',lambda self:self.name+'sb') print(obj.__dict__) print(obj.show_name(obj)) #刪除屬性
delattr(obj,'age') delattr(obj,'show_name') delattr(obj,'show_name111')#不存在,則報錯
print(obj.__dict__)
class Foo(object): staticField = "old boy"
def __init__(self): self.name = 'wupeiqi'
def func(self): return 'func' @staticmethod def bar(): return 'bar'
print getattr(Foo, 'staticField') print getattr(Foo, 'func') print getattr(Foo, 'bar')
3,getatter 使用反射的模塊blog
3.1,反射對象中的屬性和方法
class A:
def func(self):
print('in func')
a = A()
a.name = 'alex'
a.age = 63
# 反射對象的屬性
ret = getattr(a,'name') # 經過變量名的字符串形式取到的值
# 反射對象的方法
ret = getattr(a,'func') #反射對象的方法拿到的是方法的地址
ret()
3.2,反射模塊的屬性
# 內置模塊也能用
# time模塊中的 time asctime
# import time #先導入,而後能夠用字符調用
# print(getattr(time,'time')())
# print(getattr(time,'asctime')())
3.3,反射本身的模塊
# 本身的模塊
def qqxing():
print('qqxing')
year = 2018
# 反射本身模塊中的變量
import sys
print(sys.modules['__main__'].year)
# sys.modules['__main__'] 是本模塊的意思
# 反射本身模塊中的函數
getattr(sys.modules['__main__'],'qqxing')()
#反射函數拿到的是函數的地址,要加括號才能執行。
3.4,要反射的函數有參數怎麼辦?
# 直接在後面括號中正常傳參就能夠了
import time
print(time.strftime('%Y-%m-%d %H:%M:S'))
print(getattr(time,'strftime')('%Y-%m-%d %H:%M:S'))
4,hassattr 查看當中有沒有這個方法或變量,有就返回True
if hasattr(my,'name'):
getattr(my,'name')
5,setattr 設置修改變量
class A:
pass
a = A()
setattr(A,'name','alex') #在A類裏設置了一個屬性,並賦值。
print(A.name)
setattr(a,'name','nezha') #在a對象中設置了一個屬性,並賦值。
print(a.name)
6,delattr 刪除一個變量
delattr(a,'name') #刪除a對象中的name屬性
print(a.name) #對象中的沒有了,就去類裏調用