Pythonの記述子

| | | | | | | | | | |

記述子プロトコル:
他のプログラミング言語では、記述子はsetterおよびgetterと呼ばれ、パブリック関数を使用してプライベート変数を取得および設定します。 Pythonにはプライベート変数の概念がなく、記述子プロトコルは、このようなことを実現するためのPythonの方法と考えることができます。記述子—これはPythonでクラスを実装する新しい方法であり、特定のオブジェクトから何も継承する必要はありません。 Pythonで記述子を簡単に実装するには、上記で定義したメソッドの少なくとも1つを使用する必要があります。以下のインスタンスは、属性によってアクセスされたオブジェクトを返し、所有者はハンドルが属性として割り当てられたクラスであることに注意してください。 Python記述子には、setter、getter、およびdeleteメソッドの3つのプロトコルがあります。

  • gfg .__ get __(self、obj、type = None):この属性は、情報(value = obj.attr)を取得するときに呼び出され、返されるものはすべて—です。これは、属性値を要求したコードに渡されるものです。
  • gfg .__ set __(self、obj、value):このメソッドは、属性値を設定するために呼び出されます。 39;値')。何も返されません。
  • 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 __( なし self

return v

覚えておくべき重要なポイント:

  • 記述子は、 __ getattribute __()メソッドによって呼び出されます。
  • __ getattribute__()をオーバーライドすると、記述子への自動呼び出しが防止されます。
  • object .__ getattribute __()およびtype .__ getattribute __() __ get __()へのさまざまな呼び出し。
  • データ記述子は常にインスタンスディクショナリをオーバーライドします。
  • 非データ記述子は、インスタンスディクショナリによってオーバーライドできます。

記述子の例:
この例では、データ記述子は通常、値を設定して返し、アクセスをログに記録するメッセージを出力します。
コード1:


class 記述子( オブジェクト):

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

self 。 name = name


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

return "{} for {}" format self .name、 self 。name)

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

if isinstance (name、 str ):

self 。 name = name

else

raise TypeError( "名前は文字列である必要があります"


クラス GFG( オブジェクト):

名前 = 記述子()

g = GFG()

g.name = "Geeks"

print (g.name)

終了:

Python.Engineering

コード2:


< tbody>

class 記述子( オブジェクト):


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

self 。 name = name


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

return "{} for {}" format self 。name、 self 。name)


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

if isinstance (name、 str ):

self 。 name = name

else

raise TypeError( "名前は文字列である必要があります"


class GFG( オブジェクト):

名前 = 記述子()


g = GFG()

g.name = "Computer"

print (g.name)

終了:

 ComputerforComputer 

プロパティ()を使用してハンドルを作成します:
property() を使用すると、任意の属性に使用できる記述子を簡単に作成できます。 property()

プロパティを作成するための構文(fget = None、fset = None、fdel = None、doc = None)

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

#プロパティを説明するPythonプログラム( )function


#アルファベットクラス

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 5つの値">自己):

印刷 `値を削除しています`

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 記述子( オブジェクト):

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

self .name = name

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

return "{} for {}" format self 。name、 self 。name)


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

if isinstance (name、 str ):

self 。 name = name

else

raise TypeError( "名前は文字列である必要があります"


クラス GFG( オブジェクト ):

名前 = 記述子()


g = GFG( )

g.name = "Geeks "

print (g.name)

出力:

 Python.Engineering 

@propertyデコレータを使用して記述子を作成します:
これでプロパティタイプメソッドとPythonデコレータの組み合わせであるプロパティデコレータの力を使用します。


class アルファベット:

def __ init __( self 、value):

self ._ value = value


#値を取得することにより、、

@ property

def value( self ): < / p>

print `値の取得`

return self ._ value

#設定値、Äã‚Äã

@ value 。セッター

def value( self 、value):

print `値を`に設定 + value)

self ._ value =


#値を削除、Äã‚Äã

@ value .deleter

def value( self ):

print `値の削除`

del self ._ value



#値を渡す

x = アルファベット( `Peter`

print (x.value)


x.value = `Diesel`


del x.value

終了:

値の取得Peter値をディーゼルに設定値を削除

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