乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      Python中的

       小區(qū)木大爺 2019-05-13

      new: 對象的創(chuàng)建,是一個(gè)靜態(tài)方法,第一個(gè)參數(shù)是cls。(想想也是,不可能是self,對象還沒創(chuàng)建,哪來的self)

      init : 對象的初始化, 是一個(gè)實(shí)例方法,第一個(gè)參數(shù)是self。
      call : 對象可call,注意不是類,是對象。
      先有創(chuàng)建,才有初始化。即先__new__,而后__init__。
      直接看代碼:

      class Bar(object): 
        pass
        
      class Foo(object): 
        def __new__(cls, *args, **kwargs): 
          return Bar() 
        
      print Foo()
       可以看到,輸出來是一個(gè)Bar對象。

      通俗一點(diǎn)就是,當(dāng)你實(shí)例化一個(gè)對象的時(shí)候,就會(huì)執(zhí)行__new__ 方法里面的方法。__new__方法在類定義中不是必須寫的,如果沒定義,默認(rèn)會(huì)調(diào)用object.__new__去創(chuàng)建一個(gè)對象。如果定義了,就是override,可以custom創(chuàng)建對象的行為。

      class Person(object):
        """Silly Person"""
       
        def __init__(self, name, age):
          self.name = name
          self.age = age
       
        def __str__(self):
          return '<Person: %s(%s)>' % (self.name, self.age)
       
      if __name__ == '__main__':
        piglei = Person('piglei', 24)
        print piglei

      這樣便是__init__最普通的用法了。但__init__其實(shí)不是實(shí)例化一個(gè)類的時(shí)候第一個(gè)被調(diào)用 的方法。當(dāng)使用 Persion(name, age) 這樣的表達(dá)式來實(shí)例化一個(gè)類時(shí),最先被調(diào)用的方法 其實(shí)是 new 方法。

      call 這個(gè)看代碼意會(huì)

      #call.py 一個(gè)class被載入的情況下。
      class Next:
        List = []
         
        def __init__(self,low,high) :
          for Num in range(low,high) :
            self.List.append(Num ** 2)
         
        def __call__(self,Nu):
          return self.List[Nu]

      如果 這樣使用:

      b = Next(1,7)
      print b.List
      print b(2)
      輸出
      [1, 4, 9, 16, 25, 36]
      9

      但如果這樣使用:

      b = Next
      b(1,7)
      print b.List
      print b(2)
      $python ./call.py
      [1, 4, 9, 16, 25, 36]
       
      Traceback (most recent call last):
       File "cal.py", line 17, in <module>
        print b(2) 
      TypeError: __init__() takes exactly 3 arguments (2 given)

      __init__是初始化函數(shù),在生成類的實(shí)例時(shí)執(zhí)行。
      而__call__是模擬()的調(diào)用,需要在實(shí)例上應(yīng)用,因此這個(gè)實(shí)例自然是已經(jīng)執(zhí)行過__init__了。
      你所舉的后面那個(gè)例子:
      b = Next
      這并不是創(chuàng)建實(shí)例,而是將class賦給一個(gè)變量。因此后面使用b進(jìn)行的操作都是對Next類的操作,那么其實(shí)就是:

      Next(1,7)
      print Next.List
      print Next(2)

        本站是提供個(gè)人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多