Метаклассы Python

Не используйте абсолютный путь к каталогу вашего сервера.

Замените $ uploadPath = '/home/v1pyvnw05stp/public_html/images/Articulos/'.$uploadName; с $ _SERVER ['DOCUMENT_ROOT']. 'images / Articulos /'.$ uploadName;

Заменить move_uploaded_file($tmpLoc[$i],$uploadPath[$i]); на

move_uploaded_file ($ tmpLoc [$ i], $ uploadPath); 114]

6
задан 3 revs, 2 users 87% 13 March 2016 в 20:34
поделиться

3 ответа

Определением класса в Python является экземпляр типа (или экземпляр подкласса типа). Другими словами, само определение класса является объектом. С метаклассами у Вас есть способность управлять экземпляром типа, который становится определением класса.

Когда метакласс вызывается, у Вас есть способность полностью переписать определение класса. У Вас есть доступ ко всем предложенным атрибутам класса, его предков, и т.д. Больше, чем просто введение метода или удаление метода, можно радикально изменить дерево наследования, тип и в значительной степени любой другой аспект. Можно также объединить метаклассы в цепочку вместе для очень динамического и полностью замысловатого опыта.

Я предполагаю реальную выгоду, хотя то, что тип класса остается типом класса. В Вашем примере, вводя:

a_inst = A()
type(a_inst)

покажет, что это - экземпляр MyClass. Да, isinstance(a_inst, aClass) возвратился бы True, но Вы представили подкласс, а не динамично переопределенный класс. Различие там является, вероятно, ключом.

Как rjh указывает, анонимный внутренний класс также имеет последствия расширяемости и производительность. Метакласс обрабатывается только однажды, и момент, что класс определяется, и никогда снова. Пользователи Вашего API могут также расширить Ваш метакласс, потому что он не включается в функции, таким образом, Вы получаете определенную степень расширяемости.

Эта немного старая статья на самом деле имеет хорошее объяснение, которое выдерживает сравнение точно, "функциональное художественное оформление" приближаются к Вам используемый в примере с метаклассами, и показывает историю эволюции метакласса Python в том контексте: http://www.ibm.com/developerworks/linux/library/l-pymeta.html

5
ответ дан 17 December 2019 в 00:15
поделиться

Метакласс - это класс класса. IMO, парень здесь покрыл это весьма исправно, включая некоторые варианты использования. См. Вопрос переполнения стека «MetaClass», « new », «cls» и «super» - что это за механизм в точности? .

1
ответ дан 17 December 2019 в 00:15
поделиться

Вы также можете использовать вызываемый тип .

def hack(f, aClass):
    newfunc = lambda self: f()
    return type('MyClass', (aClass,), {'f': newfunc})

Я считаю, что использование type является самым простым способом попасть в мир метаклассов.

1
ответ дан 17 December 2019 в 00:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: