1. 程式人生 > 實用技巧 >jQuery中的$.getJSON、$.ajax、$.get、$.post的區別

jQuery中的$.getJSON、$.ajax、$.get、$.post的區別

示例一:

示例一:
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'
print('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__方法 '''
View Code

示例二:

'''
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