Extensão de tipos Python integrados com métodos e atributos personalizados
Em Python, você pode encontrar cenários em que deseja estender em tipos com métodos ou atributos adicionais. No entanto, alterar diretamente esses tipos não é permitido.
Por exemplo, se você tentar adicionar um método helloWorld() ao tipo dict conforme demonstrado em JavaScript, descobrirá que tal abordagem não é suportada.
Solução alternativa usando subclasses e substituição de namespace
Embora você não possa aumentar diretamente o tipo original, existe uma solução alternativa inteligente. Ao criar uma subclasse do tipo de destino e, posteriormente, substituí-lo no namespace integrado/global, você pode imitar efetivamente o comportamento desejado.
Aqui está uma implementação em 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'
Neste exemplo, a subclasse mystr estende o tipo str adicionando um método first_last(). A atribuição __builtin__.str redireciona todas as chamadas str integradas para usar a subclasse modificada. Como resultado, os objetos instanciados com o construtor str() integrado agora possuem o método first_last().
No entanto, é crucial observar que os objetos criados usando sintaxe literal ('string') permanecerão instâncias de o tipo str não modificado e não herdará os métodos personalizados.
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3