Расширение встроенных типов Python с помощью пользовательских методов и атрибутов
В Python вы можете столкнуться со сценариями, в которых вам нужно расширить встроенные в типах с дополнительными методами или атрибутами. Однако прямое изменение этих типов недопустимо.
Например, если вы попытаетесь добавить метод helloWorld() к типу dict, как показано в JavaScript, вы обнаружите, что такой подход не поддерживается.
Обходной путь с использованием подклассов и замены пространства имен
Хотя вы не можете напрямую дополнить исходный тип, существует умный обходной путь. Создавая подкласс целевого типа и впоследствии подставляя его во встроенное/глобальное пространство имен, вы можете эффективно имитировать желаемое поведение.
Вот реализация на Python:
# Built-in namespace
import __builtin__
# Extended subclass
class mystr(str):
def first_last(self):
if self:
return self[0] self[-1]
else:
return ''
# Substitute the original str with the subclass on the built-in namespace
__builtin__.str = mystr
print(str(1234).first_last()) # 14
print(str(0).first_last()) # 00
print(str('').first_last()) # ''
# Note that objects created by literal syntax will not have the extended methods
print('0'.first_last()) # AttributeError: 'str' object has no attribute 'first_last'
В этом примере подкласс mystr расширяет тип str, добавляя метод first_last(). Назначение __builtin__.str перенаправляет все встроенные вызовы str на использование измененного подкласса. В результате объекты, созданные с помощью встроенного конструктора str(), теперь обладают методом first_last().
Однако важно отметить, что объекты, созданные с использованием буквального синтаксиса («строка»), останутся экземплярами немодифицированный тип str и не будет наследовать пользовательские методы.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3