# Показать программу 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 Удаление значения | | | | |