本文實例講述了Python反射和內置方法重寫操作。分享給大家供大家參考,具體如下:
isinstance和issubclass
isinstance(obj,cls)
檢查是否obj是否是類 cls 的對象,類似 type()
class Foo(object): passobj = Foo()isinstance(obj, Foo)
issubclass(sub, super)
檢查sub類是否是 super
類的派生類
class Foo(object): passclass Bar(Foo): passissubclass(Bar, Foo)
反射
1 什么是反射
反射的概念是由Smith在1982年首次提出的,主要是指程序可以訪問、檢測和修改它本身狀態或行為的一種能力(自?。?。這一概念的提出很快引發了計算機科學領域關于應用反射性的研究。它首先被程序語言的設計領域所采用,并在Lisp和面向對象方面取得了成績。
四個反射函數
hasattr(obj,str)
檢測是否含有某屬性
getattr(obj,str)
獲取屬性,不存在報錯
setattr(obj,str,value)
設置屬性
delattr(obj,str)
刪除屬性,不存在報錯
導入其他模塊,利用反射查找該模塊是否存在某個方法
def test(): print('from the test')
item系列
__getitem__
/__setitem__
/__delitem__
class Foo: def __init__(self,name): self.name=name def __getitem__(self, item): print(self.__dict__[item]) def __setitem__(self, key, value): self.__dict__[key]=value def __delitem__(self, key): print('del obj[key]時,我執行') self.__dict__.pop(key) def __delattr__(self, item): print('del obj.key時,我執行') self.__dict__.pop(item)f1=Foo('sb')f1['age']=18f1['age1']=19del f1.age1del f1['age']f1['name']='alex'print(f1.__dict__)
運行結果:
del obj.key時,我執行
del obj[key]時,我執行
{'name': 'alex'}
__new__
class A: def __init__(self): self.x = 1 print('in init function') def __new__(cls, *args, **kwargs): print('in new function') return object.__new__(A, *args, **kwargs)a = A()print(a.x)
運行結果:
in new function
in init function
1
單例模式:
class A: def __new__(cls): if not hasattr(cls,'obj'): cls.obj = object.__new__(cls) return cls.obja = A()b = A()print(a is b)
運行結果:
True
__call__
對象后面加括號,觸發執行。
注:構造方法的執行是由創建對象觸發的,即:對象 = 類名() ;而對于 __call__ 方法的執行是由對象后加括號觸發的,即:對象()
或者 類()()
class Foo: def __init__(self): pass def __call__(self, *args, **kwargs): print('__call__')obj = Foo() # 執行 __init__obj() # 執行 __call__
新聞熱點
疑難解答