ホームページ  >  記事  >  バックエンド開発  >  Python のプライベート プロパティとプライベート メソッドについて話しましょう

Python のプライベート プロパティとプライベート メソッドについて話しましょう

WBOY
WBOY転載
2023-04-12 11:37:081443ブラウズ

Python のプライベート プロパティとプライベート メソッドについて話しましょう

1. シナリオ定義

プライベート属性

は、Python のオブジェクト指向開発プロセスでは、オブジェクトの一部の属性のみが使用できることを意味しますオブジェクト内のプロパティは内部的に使用されますが、これらのプロパティには外部からアクセスしたくないです。

つまり、プライベート属性は、オブジェクトが公開したくない属性です。

プライベート メソッド

は、Python のオブジェクト指向開発プロセスにおいて、オブジェクトの一部のメソッドまたは関数がオブジェクト内でのみ使用されるが、外部からはアクセスされることを望まないことを意味します。 . これらのメソッドまたは関数。

つまり、プライベート メソッドは、オブジェクトが公開したくないメソッドまたは関数です。

2. 構文定義

Python でプライベート プロパティとプライベート メソッドを定義するための構文は次のとおりです:

class Staff:
def __init__(self, s_name, s_salary):
self.s_name = s_name
self.__salary = s_salary

def __secret(self):
print("%s 的工资是 %d" % (self.s_name, self.__salary))

(1). __salary は 2 つのアンダースコアで始まります Private財産。

(2). __secret(self) は、2 つのアンダースコアで始まるプライベート メソッドです。

3. 呼び出し分析

(1). __init__ のオブジェクト初期化メソッドにおいて、2 つのアンダースコアで始まる __salary 属性はプライベート属性です。

次に、オブジェクトの外部で __salary 属性を呼び出して、プライベート属性に正常にアクセスできるかどうかを確認します。

Python のプライベート プロパティとプライベート メソッドについて話しましょう

上図の実行結果からわかるように、11 行目、つまり、オブジェクトの外部にあるオブジェクトのプライベート属性 __salary にアクセスすると、AttributeError エラーが発生します。というプロンプトが表示されますが、Staff オブジェクト zhangsan には属性がありません。

Staff クラス オブジェクトがインスタンス属性 __salary を持っていることを証明するには、単にオブジェクトの外部ではプライベート属性にアクセスできないためです。

self.__salary を self.salary に変更しました。__secret(self) メソッドは self.__salary 属性を参照し、対応する変更を加えました。次の図に示す実行結果を確認してください。

Python のプライベート プロパティとプライベート メソッドについて話しましょう

実行結果から、この非プライベート属性の外部呼び出しは正常であり、AttributeError エラーは表示されないことがわかります。

(2). __secret(self) インスタンスメソッドのうち、アンダースコア 2 つで始まる __secret(self) メソッドはプライベートメソッドです。

上記のテスト手順と同様に、まずオブジェクト外のプライベートメソッド __secret(self) を呼び出して、プライベートメソッドが正常に呼び出せるかどうかを確認します。

Python のプライベート プロパティとプライベート メソッドについて話しましょう

上図 11 行目の実行結果からわかるように、オブジェクトの外部にあるオブジェクトのプライベート メソッド __secret(self) にアクセスする場合、 AttributeError エラーが表示される場合、Staff オブジェクト zhangsan には __secret メソッドがありません。

プライベート メソッドはオブジェクトの外部ではアクセスできないため、Staff クラス オブジェクトにインスタンス メソッド __secret(self) があることを証明します。

__secret(self) メソッドを Secret(self) に変更しました。他のコードは変更されません。下の図に示す実行結果を参照してください。

Python のプライベート プロパティとプライベート メソッドについて話しましょう

実行結果から、この非プライベート メソッドの外部呼び出しは正常であり、AttributeError エラーは表示されないことがわかります。

(3). 以下の図からわかるように、オブジェクト内でプライベート メソッドとプライベート プロパティを呼び出すことができます。

図の work メソッドはプライベート メソッド __secret(self) を呼び出し、プライベート メソッド __secret(self) はプライベート属性 __salary を呼び出します。

Python のプライベート プロパティとプライベート メソッドについて話しましょう

Staff クラス オブジェクト zhangsan をオブジェクトの外部で使用して work メソッドを呼び出します。これにより、オブジェクトのプライベート プロパティとプライベート メソッドに間接的にアクセスできます。

コンソール出力から、work メソッドは通常、オブジェクト内で定義されたプライベート プロパティとプライベート メソッドにアクセスできることがわかります。

4. Python の疑似プライベート プロパティとプライベート メソッド

Python では、プロパティやメソッドに名前を付けるときに内部で特別な名前を付けるため、実際のプライベート性はありません。外部の世界からアクセスできないプロパティとメソッド。

プライベート属性とプライベート メソッドを例にとると、Python の内部処理メソッドは次のとおりです:

(1) 属性: __salary、処理される属性名は: _Staff__salary(_クラス名__ 属性名)

(2). メソッド: __secret、処理されたメソッド名は: _Staff__secret(_class name__method name)

プライベート属性とプライベート メソッド処理については Python を内部的に知っているので、この処理された名前付けメソッドを使用して、オブジェクトの外部のプライベート プロパティとプライベート メソッドにアクセスして、アクセスが正常かどうかを確認します。

class Staff:
def __init__(self, s_name, s_salary):
self.s_name = s_name
self.__salary = s_salary

def __secret(self):
return "%s的工资是 %d" % (self.s_name, self.__salary)
zhangsan = Staff("张三", 10000)
print(zhangsan._Staff__salary)
print(zhangsan._Staff__secret())

実行結果は次の図に示されています

Python のプライベート プロパティとプライベート メソッドについて話しましょう

コンソールは例外をスローせず、以前の AttributeError エラー メッセージも消えました。

この例は、Python が本当の意味でプライベートではないことを証明しています。その内部処理メソッドを知った後でも、_クラス名__ 属性名 (メソッド名) メソッドを使用してオブジェクトの外部にアクセスできます。プライベート プロパティへオブジェクト内で定義されたプライベート メソッド。

しかし、このメソッドは日常業務では推奨されません。オブジェクト内でプロパティとメソッドが定義されると、それらはプライベートとして宣言され、呼び出し元はそのルールに従う必要があります。

この小さな例を使って、Python には本当のプライバシーがないことを説明したいだけです。

以上がPython のプライベート プロパティとプライベート メソッドについて話しましょうの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事は51cto.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。