検索
ホームページバックエンド開発Python チュートリアルPython の関数デコレータ: @property、Getter、および Setter メソッドについて理解する

Function Decorators in Python: Understanding @property, Getter, and Setter Methods

オブジェクト指向プログラミングでは、カプセル化は、データの整合性を確保し、実装の詳細をユーザーから隠すために重要な基本概念です。シンプルさと読みやすさで知られる Python は、このカプセル化の一部としてゲッターとセッターを採用しています。この記事では、Python におけるゲッターとセッターの目的と実装について詳しく説明し、データ アクセスの管理とオブジェクトの整合性の維持におけるゲッターとセッターの役割についての洞察を提供します。特に、Python の @property デコレーターがどのようにこれらの概念を簡素化し、オブジェクト属性へのアクセスと更新に対するより Python 的なアプローチを可能にするかを検討します。

カプセル化とプライベート変数の重要性
カプセル化の中心には、データ隠蔽という概念があります。これは、オブジェクトの内部状態へのアクセスを制御して、意図しない干渉や悪用を防ぐことです。これにはプライベート変数を使用する必要があります。多くのプログラミング言語では、プライベート変数を使用して、適切な承認なしにオブジェクト内の機密データに直接アクセスしたり変更したりできないようにします。これにより、特定のオブジェクトの整合性が維持されます。
Python には他の言語のような厳密なプライベート変数はありませんが、その代わりに属性の先頭に単一 () または二重 (_) のアンダースコアを付ける規則を使用して、内部使用を目的としていることを示します。これら 2 つの規則の違いを詳しく見てみましょう。

Python における単一アンダースコア (_) と二重アンダースコア (__) の比較

a. 単一アンダースコア (_):

  • 変数の先頭にある 1 つのアンダースコア (例: _price) は、属性が内部使用を目的としていることを示すために使用される規則です。これは Python によって厳密に強制されるわけではありません。つまり、属性はクラスの外部から引き続きアクセスできます (つまり、プライベートではありません)。ただし、他の開発者に対して、その属性は「保護」されており、必要な場合を除いて直接アクセスすべきではないことを示します。 例:
class Product:
    def __init__(self, price):
        self._price = price  # Protected attribute (convention)

product = Product(10)
print(product._price)  # Accessing is possible, but discouraged

b. 二重アンダースコア (__):

  • 変数 (__price など) の先頭にある二重アンダースコアは、名前のマングリングを引き起こします。名前マングリングは、クラス外部からの誤ったアクセスや変更を防ぐために、属性の名前を内部的に変更します。これにより、まだ完全にプライベートではありませんが、属性に直接アクセスすることが難しくなります。Python は属性に _ClassName というプレフィックスを付けることで内部で属性の名前を変更し、そのマングルされた名前 (_Product__price など) でのみアクセスできるようにします。 例:
class Product:
    def __init__(self, price):
        self.__price = price  # Name-mangled attribute

product = Product(10)
# print(product.__price)  # This will raise an AttributeError
print(product._Product__price)  # Accessing the mangled attribute
  • これらは、サブクラス内の属性の誤ったオーバーライドを回避したい場合、または意図しない外部アクセスに対するより強力な保護が必要な場合に役立ちます。

プライベート属性を使用する理由
プライベート属性、特に 1 つのアンダースコア (_) で示される属性は、カプセル化を維持する上で重要です。これらは、外部コードがオブジェクトと直接対話するのを阻止することで、オブジェクトの内部状態を保護します。これは次のことに役立ちます。

  1. データの整合性の維持: プライベート属性により、機密または重要な内部データが誤って変更されるのを防ぎます。
  2. アクセス制御の有効化: getter メソッドと setter メソッド (または @property デコレータ) を使用することで、オブジェクトはその属性にアクセスまたは変更される方法とタイミングを制御し、多くの場合検証ロジックを追加します。
  3. 保守性の向上: 内部の詳細が隠されているため、クラスの外部の動作に影響を与えることなく、基礎となる実装を変更できます。

従来の Getter メソッドと Setter メソッド
多くのプログラミング言語では、プライベート変数への制御されたアクセスを提供するためにゲッターとセッターが使用されます。以下の例を参照してください:

class Product:
    def __init__(self, price):
        self._price = price  # Protected attribute

    def get_price(self):
        return self._price

    def set_price(self, value):
        if value >= 0:
            self._price = value
        else:
            raise ValueError("Price cannot be negative")

product = Product(10)
print(product.get_price())  # 10
product.set_price(20)
print(product.get_price())  # 20

この例では、ゲッター (get_price()) とセッター (set_price()) は、特定のルール (価格が負でないことの保証など) を適用しながら、_price 属性にアクセスして変更する方法を提供します。

@property デコレーター
Python では、@property デコレーターを使用してプライベート属性へのアクセスを管理する、より洗練された方法を提供します。このデコレータを使用すると、属性のように動作するメソッドを定義できるため、コードがより読みやすく Python らしくなり、同時にアクセスの制御も可能になります。

Getter と Setter に @property デコレータを使用する
以下は、構文を簡素化し、読みやすさを向上させるために @property を使用してリファクタリングされた前の例です。

class Product:
    def __init__(self, price):
        self._price = price

    @property
    def price(self):
        return self._price

    @price.setter
    def price(self, value):
        if value >= 0:
            self._price = value
        else:
            raise ValueError("Price cannot be negative")

product = Product(10)
print(product.price)  # 10
product.price = 20
print(product.price)  # 20

このリファクタリングされたバージョンでは:

  • @property デコレーターを使用すると、product.get_price() のようなゲッター メソッドを呼び出す必要がなく、属性 (つまり product.price) のように Price() にアクセスできます。

  • @price.setter デコレーターは、価格の値を設定するロジックを有効にし、検証ルールを適用しながら、product.price = 20 として設定できるようにします。

@property を使用する理由
@property デコレーターを使用すると、特にプライベート属性を扱う場合に、コードがすっきりして使いやすくなります。その理由は次のとおりです:

  1. 可読性: 検証や変換の基礎となるロジックを非表示にしたまま、属性に自然にアクセスできるようにします。
  2. カプセル化: 内部実装の詳細を公開することなく、属性へのアクセスまたは変更方法に関するルールを適用できます。
  3. 柔軟性: 外部インターフェイスを変更せずに内部動作をリファクタリングできます。つまり、コードベースの残りの部分は影響を受けません。

結論
カプセル化はオブジェクト指向プログラミングの基礎であり、Python によるプライベート変数の使用と @property デコレータは、オブジェクトの内部状態へのアクセスを管理するクリーンで柔軟な方法を提供します。単一のアンダースコア (_) を含む属性は内部使用を目的としていることを示しますが、二重アンダースコア (__) を含む属性は名前のマングリングを通じてより強力な保護を提供します。 @property デコレータを使用すると、これらのプライベート属性への制御されたアクセスを Python 的で読み取り可能な方法で実装でき、クリーンなパブリック インターフェイスを維持しながらデータの整合性を確保できます。

参考文献

  • プロパティに関する Python ドキュメント

  • PEP 318: 関数デコレーター

以上がPython の関数デコレータ: @property、Getter、および Setter メソッドについて理解するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
Pythonリストに要素をどのように追加しますか?Pythonリストに要素をどのように追加しますか?May 04, 2025 am 12:17 AM

toAppendElementStoapyThonList、usetheappend()methodforsingleelements、extend()formultipleElements、andinsert()forspecificopsitions.1)useappend()foraddingoneElementatheend.2)useextend()toaddmultipleelementseffictience.3)

Pythonリストをどのように作成しますか?例を挙げてください。Pythonリストをどのように作成しますか?例を挙げてください。May 04, 2025 am 12:16 AM

To CreateapythonList、usesquareBrackets []およびSeparateItemswithcommas.1)listsaredynamicandcanholdmixdatatypes.2)useappend()、remaid()、andslicingformanipulation.3)listcompreheNsionsionsionsionsionsionsionsionsionsionsionsionsionsionsionsionsionsientionforcreating.4)

数値データの効率的なストレージと処理が重要な実際のユースケースについて話し合います。数値データの効率的なストレージと処理が重要な実際のユースケースについて話し合います。May 04, 2025 am 12:11 AM

金融、科学研究、医療、およびAIの分野では、数値データを効率的に保存および処理することが重要です。 1)財務では、メモリマッピングされたファイルとnumpyライブラリを使用すると、データ処理速度が大幅に向上する可能性があります。 2)科学研究の分野では、HDF5ファイルはデータストレージと取得用に最適化されています。 3)医療では、インデックス作成やパーティション化などのデータベース最適化テクノロジーがデータのパフォーマンスを向上させます。 4)AIでは、データシャーディングと分散トレーニングがモデルトレーニングを加速します。システムのパフォーマンスとスケーラビリティは、適切なツールとテクノロジーを選択し、ストレージと処理速度の間のトレードオフを検討することにより、大幅に改善できます。

Pythonアレイをどのように作成しますか?例を挙げてください。Pythonアレイをどのように作成しますか?例を挙げてください。May 04, 2025 am 12:10 AM

pythonarraysarasarecreatedusingthearraymodule、notbuilt-inlikelists.1)importthearraymodule.2)specifytheTypecode、emg。、 'i'forintegers.3)Arraysofferbettermemoreefficiency forhomogeneousdatabutlasefutablethanlists。

Shebangラインを使用してPythonインタープリターを指定するための選択肢は何ですか?Shebangラインを使用してPythonインタープリターを指定するための選択肢は何ですか?May 04, 2025 am 12:07 AM

Shebangラインに加えて、Pythonインタープリターを指定するには多くの方法があります。1。コマンドラインから直接Pythonコマンドを使用します。 2。バッチファイルまたはシェルスクリプトを使用します。 3. makeやcmakeなどのビルドツールを使用します。 4. Invokeなどのタスクランナーを使用します。各方法には利点と短所があり、プロジェクトのニーズに合った方法を選択することが重要です。

リストと配列の選択は、大規模なデータセットを扱うPythonアプリケーションの全体的なパフォーマンスにどのように影響しますか?リストと配列の選択は、大規模なデータセットを扱うPythonアプリケーションの全体的なパフォーマンスにどのように影響しますか?May 03, 2025 am 12:11 AM

forhandlinglaredataSetsinpython、usenumpyArrays forbetterperformance.1)numpyarraysarememory-effictientandfasterfornumericaloperations.2)nusinnnnedarytypeconversions.3)レバレッジベクトル化は、測定済みのマネージメーシェイメージーウェイズデイタイです

Pythonのリストと配列にメモリがどのように割り当てられるかを説明します。Pythonのリストと配列にメモリがどのように割り当てられるかを説明します。May 03, 2025 am 12:10 AM

inpython、listsusedynamicmemoryallocation with allocation、whilenumpyArraysalocatefixedmemory.1)listsallocatemorememorythanneededededinitivative.2)numpyArrayasallocateexactmemoryforements、rededicablebutlessflexibilityを提供します。

Pythonアレイ内の要素のデータ型をどのように指定しますか?Pythonアレイ内の要素のデータ型をどのように指定しますか?May 03, 2025 am 12:06 AM

inpython、youcanspecthedatatypeyfelemeremodelernspant.1)usenpynernrump.1)usenpynerp.dloatp.ploatm64、フォーマーpreciscontrolatatypes。

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

WebStorm Mac版

WebStorm Mac版

便利なJavaScript開発ツール

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

Eclipse を SAP NetWeaver アプリケーション サーバーと統合します。

MantisBT

MantisBT

Mantis は、製品の欠陥追跡を支援するために設計された、導入が簡単な Web ベースの欠陥追跡ツールです。 PHP、MySQL、Web サーバーが必要です。デモおよびホスティング サービスをチェックしてください。