Python中的描述符

| | | | | | | | | | |

描述符協議:
在其他編程語言中,描述符被稱為 setter 和 getter,其中公共函數用於獲取和設置私有變量。 Python 沒有私有變量的概念,描述符協議可以被認為是一種 Python 的方式來實現這樣的事情。描述符 —它是一種在 Python 中實現類的新方法,它不需要從特定對象繼承任何東西。為了在python中輕鬆實現描述符,我們必須至少使用上面定義的方法之一。請注意,下面的實例返回屬性訪問的對象,並且所有者是句柄作為屬性分配的類。 Python 描述符中有 setter、getter 和 delete 方法的三種協議。

  • gfg .__ get __ (self, obj, type = None) :當您想要獲取信息 (value = obj.attr) 時調用此屬性,它返回的內容是 —這是將傳遞給請求屬性值的代碼的內容。
  • gfg .__ set __(self, obj, value) :調用該方法設置屬性值‚Äã‚Äã(obj .attr = &# 39; value ') 它不會返回任何東西給你。
  • gfg .__ delete __(self, obj) :從對像中刪除屬性時調用此方法(del obj.attr)

描述符調用:
當收到 set () 方法或 的調用時,會自動調用描述符>get() 方法。例如,obj.gfg obj 字典中查找 gfg。如果 gfg 定義了 __get __ () 方法,則 gfg .__ get __ (obj) 。也可以通過方法名直接調用,即gfg .__ get __ (obj) .


# 顯示 Python 程序
# 如何調用描述符

def __ getattribute __ ( self , key):

v = 對象 .__ getattribute __ ( self , key)

if hasattr ( v, `__get__` ):

return v .__ get __ ( None , self )

return v

要記住的要點:

  • 描述符由 __getattribute __ () 方法調用。
  • 覆蓋 __getattribute__ () 可防止自動調用描述符。
  • object .__ getattribute __ () type .__ getattribute __ () __get __ () 的各種調用.
  • 數據描述符總是覆蓋實例字典。
  • 實例字典可以覆蓋非數據描述符。

一個描述符的例子:
在這個例子中,一個數據描述符通常設置和返回值,Äã,Äã並打印一條消息記錄他們的訪問。
代碼 1:


class 描述符( object ):

def __ init __ ( self , name = ` `):

self 。 name = name


def __ get __ ( self , obj, objtype):

return " {} for {} " 格式 ( self .name, self .name)

def __ set __ ( self , obj, name):

if isinstance (name, str ):

self 。 name = name

else :

raise TypeError ( " 名稱應該是字符串" )


class GFG ( 對象 ):

name = 描述符()

g = GFG()

g.name = "Geeks"

print (g.name)

退出:

 Python.Engineering 

代碼2:


< tbody>

class Descriptor ( object ):


def __ init __ ( self , name = ` `):

self 。 name = name


def __ get __ ( self , obj, objtype):

return "{} for {}" 格式 ( self .name, self .name)


def __ set __ ( self , obj, name ):

if isinstance (name, str ):

self <代碼類=“普通”>。 name = name

else :

raise TypeError ( "名稱應該是字符串" )


class GFG ( object ):

名稱 = Descriptor ()


g = GFG()

g.name = "計算機"

print (g.name)

退出:

 ComputerforComputer 

使用屬性()創建句柄:
property () ,很容易為任何屬性創建一個可用的描述符。創建 property()

 屬性的語法 (fget = None, fset = None, fdel = None, doc = None) 

< table border = "0" cellpadding = "0" cellspacing = "0">

# Python程序解釋屬性( ) function


# Alphabet class

class 字母:

def __ init __ ( self , value):

self ._ value = value


# 獲取值 ‚Äã‚Äã

def getValue ( se lf ):

print ( `獲取值` )

return self ._ value


#安裝值‚Äã‚Äã

def setValue ( self , value):

print ( `設置值到` + value)

self ._ value = value


# remo ve 值 ‚Äã‚Äã

def delValue ( self ):

print ( `刪除值` )

del self ._ value


value = 屬性 (getValue, setValue, delValue,)


# 傳遞值

x = 字母 ( `GeeksforGeeks` )

print (x.value)


x.value = `GfG`

del x.value

退出:

 獲取值 Python.Engineering 將值設置為 GfG 刪除值 

使用類方法生成描述符:
在此我們創建了讓我們獲取類並覆蓋任何描述符方法 __set__ __ get__ __delete__ 。當許多不同的類和屬性需要相同的描述符時使用此方法,例如類型檢查。


class 描述符( object ):

def __ init__ ( self , name = ` `):

self .name = name

def __ get __ ( self , obj, objtype):

return " {} for {} " 格式 ( self .name, self .name)


def __ set __ ( self , obj, name ):

if isinstance (name, str ):

self <代碼類=“普通”>。 name = name

else :

raise TypeError ( "名稱應該是字符串" )


class GFG(對象 ):

name = Descriptor()


g = GFG ( )

g.name = "Geeks "

print (g.name)

< /代碼>

輸出:

 Python.Engineering 

使用@property 裝飾器創建描述符:
在此我們使用屬性裝飾器的強大功能,它是屬性類型方法和 Python 裝飾器的組合。


class 字母:

def __ init __ ( self , value):

self ._ value = value


# 通過檢索值 ‚Äã‚Äã

@property

def 值( self ):

print ( `獲取值` )

return self ._ value

# 設置值 ‚Äã‚Äã

<代碼類=“裝飾器”>@值<代碼類=“普通”>。 setter

def value ( self , value ):

print ( `設置值到` + value)

self ._ value = value


# 移除值 ‚Äã‚Äã

@value .deleter

def 值( self ):

打印 ( `刪除值` )

del self ._ value



# 傳遞值

x = 字母 ( `Peter` )

print (x.value)


x.value = `Diesel`


del x.value

退出:

 獲取值 Peter 設置值到 Diesel 刪除值 

Shop

Learn programming in R: courses

$

Best Python online courses for 2022

$

Best laptop for Fortnite

$

Best laptop for Excel

$

Best laptop for Solidworks

$

Best laptop for Roblox

$

Best computer for crypto mining

$

Best laptop for Sims 4

$

Latest questions

NUMPYNUMPY

psycopg2: insert multiple rows with one query

12 answers

NUMPYNUMPY

How to convert Nonetype to int or string?

12 answers

NUMPYNUMPY

How to specify multiple return types using type-hints

12 answers

NUMPYNUMPY

Javascript Error: IPython is not defined in JupyterLab

12 answers


Wiki

Python OpenCV | cv2.putText () method

numpy.arctan2 () in Python

Python | os.path.realpath () method

Python OpenCV | cv2.circle () method

Python OpenCV cv2.cvtColor () method

Python - Move item to the end of the list

time.perf_counter () function in Python

Check if one list is a subset of another in Python

Python os.path.join () method