jQuery中的$.getJSON、$.ajax、$.get、$.post的區別
阿新 • • 發佈:2020-09-12
示例一:
示例一: class Mymeta(type): def __init__(self,name,bases,dic): print('===>Mymeta.__init__') def __new__(cls, *args, **kwargs): print('===>Mymeta.__new__') return type.__new__(cls,*args,**kwargs) def __call__(self, *args, **kwargs): #若Foo('eagon'),self 為Foo,*args='egon'View Codeprint('aaa') obj=self.__new__(self) self.__init__(self,*args,**kwargs) return obj class Foo(object,metaclass=Mymeta): def __init__(self,name): self.name=name def __new__(cls, *args, **kwargs): return object.__new__(cls) ''' 需要記住一點:名字加括號的本質(即,任何name()的形式),都是先找到name的爹,然後執行:爹.__call__ 而爹.__call__一般做兩件事: 1.呼叫name.__new__方法並返回一個物件 2.進而呼叫name.__init__方法對兒子name進行初始化''' ''' class 定義Foo,並指定元類為Mymeta,這就相當於要用Mymeta建立一個新的物件Foo,於是相當於執行 Foo=Mymeta('foo',(...),{...}) 因此我們可以看到,只定義class就會有如下執行效果 ===>Mymeta.__new__ ===>Mymeta.__init__ 實際上class Foo(metaclass=Mymeta)是觸發了Foo=Mymeta('Foo',(...),{...})操作, 遇到了名字加括號的形式,即Mymeta(...),於是就去找Mymeta的爹type,然後執行type.__call__(...)方法 於是觸發Mymeta.__new__方法得到一個具體的物件,然後觸發Mymeta.__init__方法對物件進行初始化''' ''' obj=Foo('egon') 的原理同上 ''' ''' 總結:元類的難點在於執行順序很繞,其實我們只需要記住兩點就可以了 1.誰後面跟括號,就從誰的爹中找__call__方法執行 type->Mymeta->Foo->obj Mymeta()觸發type.__call__ Foo()觸發Mymeta.__call__ obj()觸發Foo.__call__ 2.__call__內按先後順序依次呼叫兒子的__new__和__init__方法 '''
示例二:
''' class Mymeta(type): #但凡繼承了type的類才能稱之為自定義的元類,否則就是隻是一個普通的類 pass class Teacher(object): #Teacher=Mymeta('Teacher',(object,),{...}) school = 'Qinghua' def __init__(self,name,age,sex): self.name=name self.age=age self.sex=sex def score(self): print('%s is scoring' %self.name) def __call__(self, *args, **kwargs): print(self) print(args) print(kwargs) tea1=Teacher('egon',18,'male') tea1(1,2,a=1,b=2) #__call__(tea1,(1,2).{'a':1,'b':2}) ''' 總結:物件之所以可以呼叫,是因為物件的類中有一個函式__call__ 推導:如果一切皆物件,那麼Teacher也是一個物件,該物件之所可以呼叫,肯定是這個物件的類中也定義了一個函式__call__ class Mymeta(type): #但凡繼承了type的類才能稱之為自定義的元類,否則就是隻是一個普通的類 def __call__(self, *args, **kwargs): #self=Teacher這個類,args=('egon',18,'male'),kwargs={} # 1. 先產生一個空物件 tea_obj=self.__new__(self) #tea_obj是Teacher這個類的物件 self--->Teacher # 2. 執行__init__方法,完成物件的初始屬性操作 self.__init__(tea_obj,*args,**kwargs) # 3. 返回初始化好的那個物件 return tea_obj class Teacher(object,metaclass=Mymeta): #Teacher=Mymeta('Teacher',(object,),{...}) school = 'Qinghua' #tea_obj,'egon',18,'male' def __init__(self,name,age,sex): self.name=name self.age=age self.sex=sex def score(self): print('%s is scoring' %self.name) tea1=Teacher('egon',18,'male') # 會觸發Teacher的類(即元類)中的__call__函式 print(tea1) print(tea1.__dict__)View Code