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

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

    • 分享

      Python教程:面向?qū)ο缶幊痰囊恍┲R點總結(jié)

       精品唯居 2021-04-29

      類與實例

      類是對象的定義,而實例是"真正的實物",它存放了類中所定義的對象的具體信息。

      類、屬性和方法命名規(guī)范

      類名通常由大寫字母打頭。這是標準慣例,可以幫助你識別類,特別是在實例化過程中(有時看起來像函數(shù)調(diào)用)。還有,數(shù)據(jù)屬性(變量或常量)聽起來應當是數(shù)據(jù)值的名字,方法名應當指出對應對象或值的行為。

      另一種表達方式是:數(shù)據(jù)值應該使用名詞作為名字,方法使用謂詞(動詞加對象)。數(shù)據(jù)項是操作的對象、方法應當表明程序員想要在對象進行什么操作。

      在定義的類中,大致遵循這樣的方針,數(shù)據(jù)值像 “name”, “phone” 和 “email”,行為如 “updatePhone”,“updateEmail”。這就是常說的 “混合記法(mixedCase)” 或 “駱駝記法(camelCase)”。Python 規(guī)范推薦使用駱駝記法的下劃線方式,比如, “update_phone”,“update_email”。類也要細致命名,像 “AddrBookEntry”, “RepairShop” 等等就是很好的名字。

      class AddrBookEntry(object):
      
          def __init__(self, name, phone, email):
              self.name = name
              self.phone = phone
              self.email = email
      
          def update_phone(self, phone):
              self.phone = phone
      
          def update_email(self. email):
              self.email = email
      

      新式類與舊式類

      新式類和經(jīng)典類聲明的最大不同在于,所有新式類必須繼承至少一個父類。如果沒有可繼承的類,則可繼承 object 類。object 是“所有類之母” ,它位于所有類繼承結(jié)構(gòu)的最上層。如果沒有直接或間接的子類化一個對象,那么就定義了一個經(jīng)典類。即如果沒有指定一個父類,或者如果所子類化的基本類沒有父類,這樣就是創(chuàng)建了一個經(jīng)典類。

      在 Python3 中定義的類,默認就是新式類,而在 Python2 中要定義一個新式類則必須繼承 object 或者繼承一個新式類。
      self 變量

      類的方法與普通的函數(shù)只有一個特別的區(qū)別,即它們必須有一個額外的第一個參數(shù)名稱,但是在調(diào)用這個方法的時候你不必為這個參數(shù)賦值,Python 會提供這個值。這個特別的變量指對象本身,按照慣例它的名稱是 self。雖然可以給這個參數(shù)任何名稱,但是強烈建議使用 self 這個名稱,其他名稱都是不贊成使用的。
      __init__() 方法

      __init__() 類似于類構(gòu)造器,但實際上并不是一個構(gòu)造器。Python 創(chuàng)建實例后,在實例化過程中,調(diào)用 __init__() 方法,當一個類被實例化時,就可以定義額外的行為,比如,設(shè)定初始值或者運行一些初步診斷代碼,這主要是在實例被創(chuàng)建后,實例化調(diào)用返回這個實例之前,去執(zhí)行某些特定的任務(wù)或設(shè)置。

      綁定及非綁定方法

      在 Python 中,訪問類的方法可以通過實例也可以通過類來直接訪問。但是 Python 嚴格要求,沒有實例,方法是不能被調(diào)用的。這種限制即 Python 所描述的綁定概念(binding),在此,方法必須綁定(到一個實例)才能直接被調(diào)用。非綁定的方法可能可以被調(diào)用,但實例對象一定要明確給出,才能確保調(diào)用成功。然而,不管是否綁定,方法都是它所在的類的固有屬性,即使它們幾乎總是通過實例來調(diào)用的。在 Python 中的類方法也是一種對象??梢院唵蔚睦斫饩褪牵ㄟ^類直接訪問的方法稱為“未綁定的方法”,而通過實例訪問的方法稱為“綁定的方法”:

      1. 未綁定的類方法:沒有 self

      通過類來引用方法返回一個未綁定方法對象。要調(diào)用它,你必須顯示地提供一個實例作為第一個參數(shù)。

      1. 綁定的實例方法:有 self

      通過實例訪問方法返回一個綁定的方法對象。Python 自動地給方法綁定一個實例,所以我們調(diào)用它時不用再傳一個實例參數(shù)。

      示例:

      '''
      遇到問題沒人解答?小編創(chuàng)建了一個Python學習交流QQ群:778463939
      尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學習教程和PDF電子書!
      '''
      class Test:
          def func(self, message):
              print message
      
      object1 = Test()
      x = object1.func
      x("綁定方法對象,實例是隱藏的")
      
      t = Test.func
      t(object1, "未綁定方法對象,需要傳遞一個實例")
      # t("未綁定方法對象,需要傳遞一個實例")  # 錯誤的調(diào)用
      

      類屬性與實例屬性

      類屬性僅是與類相關(guān)的數(shù)據(jù)值,和實例屬性不同,類屬性和實例無關(guān)。這些值像靜態(tài)成員那樣被引用,即使在多次實例化中調(diào)用類,它們的值都保持不變。不管如何,靜態(tài)成員不會因為實例而改變它們的值,除非實例中顯式改變它們的值。 實例屬性與類屬性的比較,類似于自動變量和靜態(tài)變量,但這只是籠統(tǒng)的類推。在你對自動變量和靜態(tài)變量還不是很熟的情況下,不要深究這些。

      類和實例都是名字空間。類是類屬性的名字空間,實例則是實例屬性的。

      可采用類來訪問類屬性,如果實例沒有同名的屬性的話,也可以用實例來訪問。
      私有化

      Python并不直接支持私有方式,而要靠程序員自己把握在外部進行特性修改的時機。

      為了讓方法或者特性變?yōu)樗接校◤耐獠繜o法訪問),只要在它的名字前面加上雙下劃線即可。由雙下劃線 __ 開始的屬性在運行時被“混淆”,所以直接訪問是不允許的。

      實際上,在 Python 帶有雙下劃線的屬性或方法并非正真意義上的私有,它們?nèi)匀豢梢员辉L問。在類的內(nèi)部定義中,所有以雙下劃線開始的名字都被“翻譯”成前面加上單下劃線和類名的形式:

      >>> class TestObj(object):
      ...     __war = "world"
      ...     
      ...     def __init__(self):
      ...         self.__har = "hello"
      ...         
      ...     def __foo(self):
      ...         print(self.__har + self.__war)
      ...         
      ...     
      ...
      >>> t = TestObj()
      >>> dir(t)
      ['_TestObj__foo', '_TestObj__har', '_TestObj__war', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getat
      tribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__
      ', '__sizeof__', '__str__', '__subclasshook__', '__weakref__']
      >>> t.__war
      Traceback (most recent call last):
        File "<input>", line 1, in <module>
          t.__war
      AttributeError: 'TestObj' object has no attribute '__war'
      >>> t.__har
      Traceback (most recent call last):
        File "<input>", line 1, in <module>
          t.__har
      AttributeError: 'TestObj' object has no attribute '__har'
      >>> t.foo()
      Traceback (most recent call last):
        File "<input>", line 1, in <module>
          t.foo()
      AttributeError: 'TestObj' object has no attribute 'foo'
      >>> t._TestObj__war
      'world'
      >>> t._TestObj__har
      'hello'
      >>> t._TestObj__foo()
      helloworld
      

      __slots__ 類屬性

      正常情況下,當我們定義了一個 class,創(chuàng)建了一個 class 的實例后,我們可以給該實例綁定任何屬性和方法,這就是動態(tài)語言的靈活性。在 Python 中默認用字典來存儲實例的屬性。示例:

      #Python學習交流群:778463939
      
      >>> class A():
      ...     pass
      ...
      >>> a = A()
      >>> a.name = "huoty"
      >>> a.age = 25
      >>> print a.name
      huoty
      >>> print a.age
      25
      >>> a.__dict__
      {'age': 25, 'name': 'huoty'}
      

      字典位于實例的“心臟” 。__dict__屬性跟蹤所有實例屬性。舉例來說,你有一個實例 inst,它有一個屬性 foo,那使用 inst.foo 來訪問它與使用inst.__dict__['foo']來訪問是一致的。

      字典會占據(jù)大量內(nèi)存,如果你有一個屬性數(shù)量很少的類,但有很多實例,那么正好是這種情況。為內(nèi)存上的考慮,可以使用 __slots__ 屬性來替代 __dict__。

      ,__slots__ 是新式類的特性。基本上,__slots__ 是一個類變量,由一序列對象組成,由所有合法標識構(gòu)成的實例屬性的集合來表示。它可以是一個列表,元組或可迭代對象。也可以是標識實例能擁有的唯一的屬性的簡單字符串。任何試圖創(chuàng)建一個其名不在__slots__中的名字的實例屬性都將導致 AttributeError 異常:

      >>> class SlotedClass(object):
      ...     __slots__ = ("foo", "bar")
      ...     
      ...
      >>> c = SlotedClass()
      >>> c.foo = 42
      >>> c.bar = "hello"
      >>> c.goo = "don't think so"
      Traceback (most recent call last):
        File "<input>", line 1, in <module>
      AttributeError: 'SlotedClass' object has no attribute 'goo'
      

      這種特性的主要目的是節(jié)約內(nèi)存。其副作用是某種類型的"安全",它能防止用戶隨心所欲的動態(tài)增加實例屬性。帶 __slots__ 屬性的類定義不會存在__dict__了(除非你在 __slots__ 中增加__dict__元素)。

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

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多