カスタム メソッドと属性による組み込み Python 型の拡張
Python では、組み込み型を拡張したいシナリオに遭遇することがあります。追加のメソッドまたは属性を持つ型。ただし、これらの型を直接変更することは許可されていません。
たとえば、JavaScript で示されているように、dict 型に helloWorld() メソッドを追加しようとすると、そのようなアプローチはサポートされていないことがわかります。
サブクラス化と名前空間置換を使用した回避策
元の型を直接拡張することはできませんが、賢い回避策が存在します。ターゲットの型をサブクラス化し、その後それを組み込み/グローバル名前空間内で置き換えることにより、目的の動作を効果的に模倣できます。
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 サブクラスは first_last() メソッドを追加することで str 型を拡張します。 __builtin__.str 割り当ては、すべての組み込み str 呼び出しをリダイレクトし、代わりに変更されたサブクラスを使用します。その結果、組み込みの str() コンストラクターでインスタンス化されたオブジェクトは first_last() メソッドを所有するようになりました。
ただし、リテラル構文 ('string') を使用して作成されたオブジェクトは、次のインスタンスのままになることに注意することが重要です。変更されていない str 型であり、カスタム メソッドは継承されません。
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3