Дескриптор в Python

| | | | | | | | | | | | | | | | |

Протокол дескриптора.
В других языках программирования дескрипторы называются сеттерами и геттерами, где общедоступные функции используются для получения и установки частной переменной. В Python нет концепции закрытых переменных, и протокол дескриптора можно рассматривать как питоновский способ добиться чего-то подобного. Дескрипторы — это новый способ реализации классов в Python, и ему не нужно ничего наследовать от конкретного объекта. Чтобы легко реализовать дескрипторы в Python, мы должны использовать хотя бы один из методов, определенных выше. Обратите внимание, что приведенный ниже экземпляр возвращает объект, к которому был получен доступ с помощью атрибута, и что владельцем является класс, в котором дескриптор был назначен в качестве атрибута. В дескрипторе Python есть три протокола для сеттеров, геттеров и метода удаления.

  • 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() или метода получить () метод. Например, obj.gfg ищет gfg в словаре obj . Если gfg определяет метод __get __() , тогда gfg .__ get __ (obj) . Его также можно вызвать напрямую по имени метода, например gfg .__ get __ (obj) .


# Показать программу Python
# как вызвать дескриптор

def __ getattribute __ ( self , key):

v = object .__ getattribute __ ( self , key)

if hasattr ( v, `__get__` ):

return v .__ get __ ( None , self )

return v

Важные моменты, которые следует помнить:

  • Дескрипторы вызываются методом __getattribute __() .
  • Переопределение __getattribute__() предотвращает автоматические вызовы дескриптора.
  • object .__ getattribute __ () и type .__ getattribute __ () различные вызовы __get __ () .
  • Описатели данных всегда переопределяют словари экземпляров.
  • Описатели, не являющиеся данными, могут быть переопределены экземплярными словарями.

Пример дескриптора:
В этом примере дескриптор данных обычно устанавливает и возвращает значения ‚Äã‚Äãи печатает сообщение, регистрируя их доступ.
Код 1:


class Дескриптор ( объект ):

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

self . имя = имя


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

return " {} for {} "< /код> <класс кода = "простой">. format ( self .name, self .name)

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

if isinstance (name, str ):

self . имя = имя

else :

поднять TypeError ( " Имя должно быть string " )


class GFG ( объект ):

имя = Дескриптор ()

g = GFG ()

g.name = "Гики"

print (g.name)

Выход:

 Python.Engineering 

Код 2:


< tbody>

class Дескриптор ( объект ):


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

self . имя = имя


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

return "{} for {}" . format ( self .name, self .name)


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

if isinstance ( name, str ):

self <класс кода = "обычный">. имя = имя

else :

поднять TypeError ( "Имя должно быть строкой" )


class GFG ( объект ):

name = Дескриптор ()


g = GFG ()

g.name = "Компьютер"

print ( g.name)

Выход:

 ComputerforComputer 

Создайте дескриптор, используя свойство ():
property () , легко создать удобный дескриптор для любого атрибута. Синтаксис для создания свойства property()

 (fget = None, fset = None, fdel = None, doc = None) 

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

# Программа Python для объяснения свойства ( ) function


# Alphabet class

class Алфавит:

def __ init __ ( self , value):

self ._ значение = значение


# получение значений ‚Äã‚Äã

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 Дескриптор ( объект ):

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

else :

поднять TypeError ( "Имя должно быть строкой" )


class GFG ( object ):

имя = Дескриптор ()


g = GFG ( )

g.name = "Geeks "

print (g.name)

< /код>

Вывод:

 Python.Engineering 

Создайте дескриптор с помощью декоратора @property:
В этом мы используем возможности декораторов свойств, которые представляют собой комбинацию метода типа свойства и декораторов Python.


class Алфавит:

def __ init __ ( self , значение):

self ._ значение = значение


# путем извлечения значений ‚Äã‚Äã

@ property

def value ( self ):

print ( `Получение значения` )

return self ._ значение

# значение настройки ‚Äã‚Äã

< класс кода = "декоратор"> @значение <класс кода = "обычный">. setter

def value ( self , value ):

print ( `Установка значения в ` + value)

self ._ value = value


# удалить значения ‚Äã‚Äã

@value .deleter

def значение ( self ):

print ( `Удаление значения` )

del self ._ value



# передать значение

x = Алфавит ( `Питер` )

print (x.value)


x.value = `Дизель`


del x.value

Выход:

 Получение значения Peter Установка значения на Diesel Удаление значения