def my_method(self): print "self:", self 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

def my_method(self): print "self:", self

Поиск

def my_method(self): print "self:", self

 

My_Class = type('My_Class', (object,), {'my_method': my_method})

 

В качестве первого параметра type передается имя класса,второй параметр-базовые классы для данного класса,третий-атрибуты.

В результате получится класс,эквивалентный следующему:

 

class My_Class(object): def my_method(self): print "self:", self

 

Но самое интересное начинается при попытке составить собственный метакласс.Проще всего наследовать метакласс от метаклассаtype (пример взят из статьи Дэвида Мертца):

 

>>> class My_Type(type):


 


... def __new__(cls, name, bases, dict):

 

... print "Выделение памяти под класс", name

... return type.__new__(cls, name, bases, dict)

... def __init__(cls, name, bases, dict):

... print "Инициализация класса", name

 

... return super(My_Type, cls).__init__(cls, name, bases, dict)

 

...

>>> my = My_Type("X", (), {})

 

Выделение памяти под класс X Инициализация класса X

 

В этом примере не происходит вмешательство в создание класса.Но в __new__() и

 

__init__() имеется полный программный контроль над создаваемым классом в период выполнения.

Примечание:

 

Следует заметить,что в метаклассах принято называть первый аргумент методов не self,а cls,чтобы напомнить,что экземпляр,над которым работает программист,является не просто объектом,а классом.

 

Мультиметоды

 

Некоторые объектно-ориентированные"штучки"не входят в стандартныйPythonили стандартную библиотеку.Ниже будут рассмотрены мультиметоды-методы,сочетающие объекты сразу нескольких различных классов.Например,сложение двух чисел различных типов фактически требует использования мультиметода.Если"одиночный"метод достаточно задать для каждого класса,то мультиметод требует задания для каждого сочетания классов,которые он обслуживает:

 

>>> import operator

>>> operator.add(1, 2)

>>> operator.add(1.0, 2)



Поделиться:


Последнее изменение этой страницы: 2024-06-27; просмотров: 54; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 216.73.217.128 (0.007 с.)