欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

如何在Python中使用descriptor描述符-創(chuàng)新互聯(lián)

本篇文章給大家分享的是有關(guān)如何在Python中使用descriptor描述符,小編覺得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

創(chuàng)新互聯(lián)公司是一家以網(wǎng)站建設(shè)公司、網(wǎng)頁設(shè)計(jì)、品牌設(shè)計(jì)、軟件運(yùn)維、成都網(wǎng)站營銷、小程序App開發(fā)等移動開發(fā)為一體互聯(lián)網(wǎng)公司。已累計(jì)為成都資質(zhì)代辦等眾行業(yè)中小客戶提供優(yōu)質(zhì)的互聯(lián)網(wǎng)建站和軟件開發(fā)服務(wù)。

描述符(descriptor)是實(shí)現(xiàn)了__get__、__set__、__del__方法的類,進(jìn)一步可以細(xì)分為兩類:

數(shù)據(jù)描述符:實(shí)現(xiàn)了__get__和__set__

非數(shù)據(jù)描述符:沒有實(shí)現(xiàn)__set__

描述符在類的屬性調(diào)用中起著很重要的作用,類在調(diào)用屬性時,遵守兩個規(guī)則:

按照實(shí)例屬性、類屬性的順序選擇屬性,即實(shí)例屬性優(yōu)先于類屬性

如果在類屬性中發(fā)現(xiàn)同名的數(shù)據(jù)描述符,那么該描述符會優(yōu)先于實(shí)例屬性

非數(shù)據(jù)描述符會被實(shí)例屬性覆蓋

class A:
  def __get__(self, obj, cls):
    return f"{obj}: get"
class B:
  value = A()

  def __init__(self):
    self.value = 4
def main():
  g = B()
  print(g.value)
  print(g.__dict__)
if __name__ == "__main__":
  main()

輸出結(jié)果

4
{'value': 4}

數(shù)據(jù)描述符優(yōu)于實(shí)例屬性

class A:
  def __get__(self, obj, cls):
    return f"{obj}: get"

  def __set__(self, obj, value):
    print(f"{obj}: set, {value}")

class B:
  value = A()

  def __init__(self):
    self.value = 4

def main():
  g = B()
  print(g.value)
  print(g.__dict__)

if __name__ == "__main__":
  main()

輸出結(jié)果

<__main__.B object at 0x000001165EB85898>: set, 4
<__main__.B object at 0x000001165EB85898>: get
{}

從上述兩個例子中可以看到,類B的value屬性是一個描述符,當(dāng)value屬性是一個數(shù)據(jù)描述符時,它屏蔽了實(shí)例的同名屬性value,實(shí)例對value屬性的讀取與賦值都會直接被轉(zhuǎn)移到類屬性value上。

使用描述符實(shí)現(xiàn)類的靜態(tài)方法與類方法

from functools import partial

class Staticmethod:

  def __init__(self, method):
    self.method = method

  def __get__(self, obj, cls):
    return self.method

class Classmethod:

  def __init__(self, method):
    self.method = method
  
  def __get__(self, obj, cls):
    return partial(self.method, cls)

class A:

  @Staticmethod
  def f(self):
    print(f"I'm method f, the value is {self}")
  
  @Classmethod
  def c(self):
    print(f"my class is {self}")
a = A()
a.f(23)
A.f(23)
a.c()
A.c()

輸出結(jié)果

I'm method f, the value is 23
I'm method f, the value is 23
my class is <class '__main__.A'>
my class is <class '__main__.A'>

靜態(tài)方法與類方法統(tǒng)一了類屬性的兩種引用方式。這種統(tǒng)一的過程可以使用描述符修改屬性訪問的默認(rèn)方式實(shí)現(xiàn)。靜態(tài)方法限制實(shí)例的默認(rèn)綁定,將方法當(dāng)做普通函數(shù)使用;類方法始終將類作為第一個參數(shù)傳入,上述的partial將類固定為方法的第一個參數(shù)。

總結(jié)

  • 描述符是實(shí)現(xiàn)了__get__、__set__、__del__等特殊方法的類,在屬性訪問時起著很大的作用。

  • 數(shù)據(jù)描述符會覆蓋同名的實(shí)例屬性,通過使用數(shù)據(jù)描述符,達(dá)到通過實(shí)例修改類變量的目的。

  • 描述符用于修改屬性的默認(rèn)訪問方式,借此可以實(shí)現(xiàn)類方法與靜態(tài)方法。

以上就是如何在Python中使用descriptor描述符,小編相信有部分知識點(diǎn)可能是我們?nèi)粘9ぷ鲿姷交蛴玫降摹OM隳芡ㄟ^這篇文章學(xué)到更多知識。更多詳情敬請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

文章名稱:如何在Python中使用descriptor描述符-創(chuàng)新互聯(lián)
分享URL:http://www.chinadenli.net/article42/dgeohc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站制作外貿(mào)建站軟件開發(fā)動態(tài)網(wǎng)站電子商務(wù)靜態(tài)網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

搜索引擎優(yōu)化