Pythonでのデータのカプセル化とプライベート属性

データのカプセル化とプライベート属性

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
#这样就能访问到了

おすすめ

転載: blog.csdn.net/weixin_43901214/article/details/106916385