Python 進階_OOP 面向對象編程_類屬性和方法

      網友投稿 751 2025-03-31

      目錄

      目錄

      類屬性

      調用類屬性

      查看類屬性

      特殊的類屬性

      類方法

      真構造器 __new__

      Python 進階_OOP 面向對象編程_類屬性和方法

      類屬性

      在理解類屬性之前要先搞清楚 實例屬性 和 函數屬性 之間的區別:

      1. 實例屬性:指的是實例化類對象的屬性,需要在類中使用 self 關鍵字來將其和實例化對象綁定的屬性。

      2. 函數屬性:指的是定義在函數體內的屬性,其可以是實例屬性,也可以是類屬性。

      3. 類屬性:是一個與實例無關的屬性,比起實例屬性而言,它更加的 靜態,當定義在類方法中時,并不會因為方法調用的完畢而被回收。類屬性,在類定義中直接指定,無須 self 關鍵字,所以也只能在類中使用。所以類屬性只能通過類的成員方法或類調用來更新。

      靜態:表示一個對所有實例而言都是相對固定的值

      NOTE:類屬型也稱之為 靜態屬性,當我們定義一個類靜態屬性時,無須實例化對象,直接可以通過類來調用該屬性,直到這個類被回收為止。如果在 Java 中,你需要使用 static 來指定。當然類的實例化對象也可以通過句點標識符來調用和更改,但此時的更改并不會影響原來的類靜態屬性。

      EXAMPLE:

      In [48]: class AClass(object): ...: LOG = 'Define a class' ...: In [49]: AClass.LOG Out[49]: 'Define a class' In [50]: a_object = AClass() In [51]: a_object.LOG Out[51]: 'Define a class' In [52]: a_object.LOG = 'Call the static attribute.' In [53]: a_object.LOG Out[53]: 'Call the static attribute.' In [54]: AClass.LOG Out[54]: 'Define a class'

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      15

      16

      17

      18

      19

      通過這個例子可以看出類屬性的調用可以完全無需實例化一個類對象。

      調用類屬性

      注意:在類定義的函數體中調用類屬性,需要通過 類名結合句點標識符 的方式來調用,否則會出發 NameError

      In [93]: class AClass(object): ...: LOG = 'Define a class' ...: def my_func(self): ...: print ''.join(['log: ', AClass.LOG]) ? # 函數體中 ? ...: print ''.join(['log is: ', LOG]) ? # 類體中 ? ...: ...: log is: Define a class In [91]: a_object = AClass() In [92]: a_object.my_func() log: Define a class

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      15

      查看類屬性

      Python 為此提供了兩個方法:

      通過 dir() 來查看類屬性

      In [55]: dir(AClass) Out[55]: ['LOG', '__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__']

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      15

      16

      17

      18

      19

      20

      21

      class.__dict__ 來查看類屬性,等效于vars(AClass)

      In [83]: AClass.__dict__ Out[83]: dict_proxy({'LOG': 'Define a class', '__dict__': , '__doc__': None, '__module__': '__main__', '__weakref__': })

      1

      2

      3

      4

      5

      6

      7

      兩者的區別在于:前者僅能查看類屬性的列表,后者可以查看類屬性的鍵值對字典。

      特殊的類屬性

      從上述的例子可以看出類中處理我們定義的 LOG 屬性之外還有很多以雙下劃線 “__” 開頭和結尾的屬性,這些屬性都是 Python 的特殊屬性。

      NOTE:其中 __dict__ 是一個包含了類屬性的字典,方 Python 解析器訪問一個類屬性時,就會在這個字典中搜索。如果在該類的字典中沒有搜索到,那么就會到該類的父類的屬性字典中搜索。這樣的話就能夠將不同類之間的屬性名隔離開來,在子類中對屬性字典的修改并不會影響到父類的屬性字典。

      類方法

      類方法就最基本的特征就是需要傳遞一個 class 對象作為方式的實參。

      真·構造器 __new__()

      與 __init__() 相比 __new__() 才是真正的構造器,實際上,在 Python 解析器中是先調用了 __new__() 生成一個實例,再將該實例對象傳入 __init__() 實現初始化操作。但 __new__() 很少需要我們去重載,一般只有在派生了不可變類型的子類后需要重載,EG. 派生 String/Int/Tuple 等

      為什么說 __new__() 是真·構造器呢?

      因為這個特殊的類方法是真的返回了一個類的實例對象,而不像 __init__() 是傳入了一個實例化對象。

      EXAMPLE:不可表類型的派生

      class RoundFloat(float): def __new__(cls, val): return float.__new__(cls, round(val, 2)) #因為 __new__ 是一個類方法,所以我們要顯式的傳遞一個類對象

      1

      2

      3

      類 RoundFloat 是類 float 的子類,我們通過重載父類的 __new__() 構造器來定制一個新的不可變類型(Python 2.2之后將類和類型統一了,所以可以繼承 Python 的內置數據類型)。當實例化 RoundFloat 的對象時,實際上是實例化了Python 內置數據類型 Float 的對象,并對這個對象做了一些定制化的操作(round(val, 2))。

      NOTE:即便我們也可以通過重載 __init__() 來實現這個結果,但這里卻不能這么做。因為如果 __new__() 沒有被重載的話,仍會默認調用父類 Float 的構造器,創建 Float 類型的對象,而不是創建現在的 RoundFloat 類型對象。這也是兩者的本質區別。

      Python 面向對象編程

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:wps怎么做目錄頁?
      下一篇:Excel2010中通過公式對合并單元格進行隔行填充不同的顏色(excel隔兩行填充顏色)
      相關文章
      亚洲av午夜福利精品一区| 亚洲一区二区三区首页| 亚洲成熟丰满熟妇高潮XXXXX | 亚洲成av人片不卡无码| 亚洲精选在线观看| 亚洲好看的理论片电影| 婷婷精品国产亚洲AV麻豆不片| 亚洲精品无码成人AAA片| 亚洲欧洲无码AV电影在线观看 | 亚洲深深色噜噜狠狠网站| 亚洲国产人成在线观看| 亚洲制服在线观看| 亚洲av无码专区在线| 亚洲av无码专区在线| 亚洲人成网站在线播放2019 | 亚洲资源在线观看| 少妇中文字幕乱码亚洲影视| 亚洲卡一卡2卡三卡4卡无卡三| 亚洲综合久久综合激情久久| 亚洲黄网在线观看| 亚洲国产亚洲片在线观看播放| 亚洲精品综合久久中文字幕| 久久国产精品亚洲综合| 亚洲丁香色婷婷综合欲色啪| 亚洲欧洲在线观看| 亚洲日韩中文字幕| 久久精品国产亚洲AV蜜臀色欲| 亚洲男人天堂2022| 亚洲变态另类一区二区三区 | 在线观看亚洲人成网站| 亚洲一区二区久久| 亚洲乱码无人区卡1卡2卡3| 久久无码av亚洲精品色午夜| 亚洲国产成人精品91久久久| 国产亚洲精品精品国产亚洲综合| 亚洲男人的天堂www| 91亚洲导航深夜福利| 亚洲av产在线精品亚洲第一站| 亚洲人成网站在线播放2019| 亚洲精品高清一二区久久| 国产亚洲无线码一区二区|