파이썬의 기술자

| | | | | | | | | | |

설명자 프로토콜:
다른 프로그래밍 언어에서 설명자는 setter 및 getter라고 하며, 여기서 공개 함수는 개인 변수를 가져오고 설정하는 데 사용됩니다. Python에는 개인 변수에 대한 개념이 없으며 디스크립터 프로토콜은 이와 같은 것을 달성하기 위한 Pythonic 방법으로 생각할 수 있습니다. 설명자 — 이것은 파이썬에서 클래스를 구현하는 새로운 방법이며 특정 객체에서 아무 것도 상속할 필요가 없습니다. 파이썬에서 디스크립터를 쉽게 구현하려면 위에서 정의한 방법 중 하나 이상을 사용해야 합니다. 아래 인스턴스는 속성이 액세스한 개체를 반환하고 소유자는 핸들이 속성으로 할당된 클래스입니다. Python 설명자에는 setter, getter 및 delete 메서드에 대한 세 가지 프로토콜이 있습니다.

  • 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 .__는 __ (obj) 를 얻습니다. 메서드 이름으로 직접 호출할 수도 있습니다(예: gfg .__ get __ (obj) .


# Python 프로그램 표시
# 설명자를 호출하는 방법

def <코드 클래스 = "일반"> __ getattribute __ ( <코드 클래스 = "color1"> 자체 <코드 클래스 = "일반">, 키):

<코드 클래스 = "일반"> v <코드 클래스 = "키워드"> = <코드 클래스 = "함수"> 개체 <코드 클래스 = "일반"> .__ getattribute __ ( self , key)

if hasattr ( v, <코드 클래스 = "문자열"> `__get__` ):

반환 v .__ get __ ( 없음 , 자기 )

반환 v

기억해야 할 중요 사항:

  • 설명자는 __getattribute __ () 메서드에 의해 호출됩니다.
  • __getattribute__ () 재정의는 설명자에 대한 자동 호출을 방지합니다.
  • object .__ getattribute __ () type .__ getattribute __ () __get __ ( ) 에 대한 다양한 호출 .
  • 데이터 설명자는 항상 인스턴스 사전을 재정의합니다.
  • 비데이터 설명자는 인스턴스 사전에 의해 재정의될 수 있습니다.

설명자의 예:
이 예에서 데이터 설명자는 일반적으로 값을 설정 및 반환하고 액세스를 기록하는 메시지를 인쇄합니다.
코드 1:


<표 테두리 = "0" cellpadding = "0 "cellspacing =" 0 ">

class 설명자( 개체 < 코드 클래스 = "일반">):

<코드 클래스 = "키워드"> def <코드 클래스 = "일반"> __ 초기화 __ ( self , 이름 = ` `):

<코드 클래스 = "color1"> 자체 <코드 클래스 = "일반">. 이름 <코드 클래스 = "키워드"> = <코드 클래스 = "일반"> 이름


<코드 클래스 = "키워드"> def __ get __ ( 자체 , obj, objtype):

반환 " {} for {} "< /코드> <코드 클래스 ="일반 ">. 형식 ( 자체 .name, self . name)

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

if isinstance (이름, str ):

자체 . 이름 = 이름

else :

TypeError( " 이름은 문자열이어야 합니다. " )


class GFG ( 개체 ):

이름 = 설명자()

<코드 클래스 = "일반"> g <코드 클래스 = "키워드"> = <코드 클래스 = "일반"> GFG ()

g.name = "괴짜"

인쇄 (g.name)

종료:

<사전> Python.Engineering

코드 2:


< tbody>

class 설명자( 개체 ):


def __ 초기화 __ ( 자기 , 이름 = 코드 클래스 = "일반"> ` `):

자체 . 이름 <코드 클래스 = "키워드"> = <코드 클래스 = "일반"> 이름


<코드 클래스 = "키워드"> def __ get __ ( 자체 , obj, objtype):

반환 "{} for {}" . 형식 ( 자체 . 이름, <코드 클래스 = "color1"> 자체 <코드 클래스 = "일반">. 이름)


<코드 클래스 = "keyword"> def __ set __ ( 자체 , obj, 이름 ):

if isinstance ( 이름, str ):

자체 <코드 클래스 = "일반">. 이름 = name

else :

TypeError ( "이름은 문자열이어야 함" )


class GFG ( 개체 <코드 클래스 = "일반">):

<코드 클래스 = "일반"> 이름 <코드 클래스 = "키워드"> = 설명자()


g = <코드 클래스 = "일반"> GFG ()

<코드 클래스 = "일반"> g.name <코드 클래스 = "키워드" > = "컴퓨터"

인쇄 <코드 클래스 = "plain"> ( g.name)

종료:

 ComputerforComputer 

속성()을 사용하여 핸들 만들기:
속성() 를 사용하면 모든 속성에 대해 사용 가능한 설명자를 쉽게 만들 수 있습니다. property()

 속성 생성 구문(fget = None, fset = None, fdel = None, doc = None) 

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

# 속성을 설명하는 Python 프로그램( ) 기능


# 알파벳 클래스

클래스 알파벳:

def __ init __ ( 자기 , 값):

자기 <코드 클래스 = "일반"> ._ 값 <코드 클래스 = "키워드"> = <코드 클래스 = "일반"> 값


# 값 가져오기 ‚Äã‚Äã

def getValue ( se lf <코드 클래스 = "일반">):

<코드 클래스 = "키워드"> 인쇄 <코드 클래스 = "일반"> ( `값 가져오기` )

반환 자체 ._ 값


# 설치 값 ‚Äã‚Äã

def setValue ( 자기 , 값):

인쇄 ( `값 설정` + 값)

자체 ._ 값 =


# remo ve 값 ‚Äã‚Äã

def delValue( 자체 ):

인쇄 ( `값 삭제` )

del 자체 ._ 값


= 속성 (getValue, setValue, delValue,)


# 값 전달

x = 알파벳 ( `GeeksforGeeks` )

인쇄 (x.value)


<코드 클래스 = "일반"> x.값 <코드 클래스 = "키워드"> = <코드 클래스 = "문자열"> `GfG`

del x.value

종료:

 값 가져오기 Python.Engineering 값을 GfG로 설정 값 삭제 

클래스 메서드를 사용하여 설명자 생성:
여기에서 클래스를 가져오고 설명자 메서드 __set__ , __ get__ 를 재정의합시다. code> 및 __delete__ . 이 메서드는 예를 들어 유형 검사와 같이 다양한 클래스와 속성에 대해 동일한 설명자가 필요한 경우에 사용됩니다.


<코드 클래스 = "키워드"> 클래스 <코드 클래스 = "plain"> 설명자( 개체 ):

def < 코드 클래스 ="일반 "> __ 초기화__ ( <코드 클래스 = "color1"> 자체 <코드 클래스 = "일반">, 이름 <코드 클래스 = "키워드"> = ` `):

자기 < /코드> <코드 클래스 ="일반 "> .이름 <코드 클래스 ="키워드 "> = <코드 클래스 ="일반 "> 이름

def __ get __ ( < 코드 클래스 = "color1"> 자체 <코드 클래스 = "일반">, obj, objtype):

반환 " {} for {} " . 형식 ( 자체 . 이름, <코드 클래스 = "color1"> 자체 <코드 클래스 = "일반">. 이름)


<코드 클래스 = "keyword"> def __ set __ ( 자체 , obj, 이름 ):

if isinstance (이름, str ):

자체 <코드 클래스 = "일반">. 이름 = 이름

else :

올리기 <코드 클래스 = "일반"> TypeError ( "이름은 문자열이어야 합니다" )


class GFG ( 개체 ):

이름 = 설명자()


g = GFG( )

g.name = "괴짜 "

인쇄 (g.name)

< /코드>

출력:

 Python.Engineering 

@property 데코레이터를 사용하여 설명자 생성:
여기에서 속성 유형 메서드와 Python 데코레이터의 조합인 속성 데코레이터의 기능을 사용합니다.


class 알파벳:

def __ init __ ( 자기 , 값):

자체 ._ 값 <코드 클래스 = "키워드"> = <코드 클래스 = "일반"> 값


<코드 클래스 = "주석" > # 값을 검색하여 ‚Äã‚Äã

@ property

<코드 클래스 = "키 word"> def 값 ( 자체 ):

인쇄 ( `값 가져오기` )

반환 자기 ._ 값

# 설정 값 ‚Äã‚Äã

< 코드 클래스 = "데코레이터"> @ 값 <코드 클래스 = "일반">. setter

def 값( 자체 code> , 값 ):

인쇄 ( `값을 `로 설정 + 값)

자체 ._ 값 =


# 값 제거 ‚Äã‚Äã

@ 값 .deleter

def 값( 자체 ):

인쇄 ( `값 삭제` )

del 자기 ._ 값



# 값 전달

x = 알파벳 ( `피터` )

인쇄 (x.value)


x.value <코드 클래스 = "키워드"> = <코드 클래스 = "문자열"> `디젤`


<코드 class = "keyword"> 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