データのカプセル化とプライベート属性
java
一般的な使用private
と同様に、protected
クラスにプライベートメソッドと保護されたメソッドを実装します。
私がしているchapter04
書かれclass_method.py
たフォルダ内のファイルを、そしてDate
クラスは、ファイルに定義されています。特定のDate
クラスについては、このブログを参照してください
次に、Date
クラスをインポートします
from chapter04.class_method import Date
class User:
def __init__(self):
self.brithday = birthday
def get_age(self):
#返回年龄
return 2018 - self.birthday.year
if __name__ = "__main__":
user = User(Date(1990,2,1))
print(user.get_age()) # 28 2018-1990
print(user.birthday) # 1990/2/1 可以获取到用户的birthday
User
クラスの初期化で渡されるパラメータは生年月日ですが、誰かの年齢を取得するときにオブジェクトを非表示にする場合birthday
、つまり、直接アクセスできないbirthday
場合は、非表示にします。
python
プライベート属性をカプセル化するには、二重下線を使用します。
class User:
def __init__(self):
self.__brithday = birthday
def get_age(self):
#返回年龄
return 2018 - self.__birthday.year
if __name__ = "__main__":
user = User(Date(1990,2,1))
print(user.get_age()) # 28
print(user.__birthday) # ‘User’ object has no attribute ‘__birthday’
プライベートプロパティは实例.私有属性
、サブクラスを介して、またはサブクラスを介して取得することはできませんが、クラス内のパブリックメソッドで使用できprint(user.get_age())
ます。つまり、結果は28になります。
関数の前に二重アンダースコアを追加すると、関数を非表示にすることもできますが、理論的には、二重アンダースコアは言語レベルからのプライベートプロパティの絶対的なプライバシーを解決しませんが、少しトリックを追加します。ウィル__birthday
なる_User__birthday
ように構成する方法。
_User__birthday
これUser
は現在のクラスを表します。それが別のクラスである場合は、別のクラス名に置き換えます。これにより、異なるクラス間の同じ属性名の競合を軽減することもできます。
print(user._User__birthday) # 1990/2/1
#这样就能访问到了