クラスを定義するとき、開発を支援するためにプライベート属性を定義することがあります。プライベートは、この属性をプライベート属性として変更するために他の言語でよく使用されます。しかし、あなたは知っていますか?同じことが私有財産であり、いくつかの開発言語は真の私有財産であり、いくつかは偽の私有財産です。
例:OC開発プロセスに表示されるプライベート属性は偽のプライベート属性であり、実行時に簡単に取得および変更できます。同時に、swiftのプライベート属性は真のプライベート属性であり、通常はプライベートで変更する必要があります。
では、Python開発では、プライベート属性をどのように定義しますか?慣例として、通常、属性の前に2つの下線を追加します。つまり、__ ageはプライベート属性を表します。
あなたは質問があるかもしれません、このプロパティは本当の私有財産ですか、それとも偽の私有財産ですか?
まず、クラスを定義し、クラス内の2つのプロパティを初期化します。そのうちの1つはプライベートです。次のように:
classPerson(object):
# コンストラクタ
def__init__(self,name):
self.name=name
self.__age=18
オブジェクトを作成し、name属性を初期化します。
obj=Person("lily")print(obj.name)
モジュールを実行すると、次のように出力されます:lily
したがって、プライベートプロパティにアクセスする方法:
print(obj.__age)
モジュールを実行した後、コンソールは次のように出力します。
‘Person’ object has no attribute ‘__age’
年齢はプライベート属性であるため、この属性に直接アクセスすることはできません。
正しい呼び出し方法は次のとおりです。
print(obj._Person__age)
コンソールは印刷できます:18
同様に、プライベート属性を再割り当てできます
obj._Person__age = 20
print(obj._Person__age)
コンソールは印刷できます:20
別のクラスを作成してPersonを継承する場合、どのようにしてプライベートプロパティにアクセスし、変更を加えることができますか?
classStudent(Person):def__init__(self):
self.__gender='male'
stu=Student()print(stu._Student__gender)
コンソールが印刷されます:男性
親クラスのプライベートプロパティにアクセスするとどうなりますか?
print(stu._Person__age)
このとき、コンソールは次のように出力します。「Student」オブジェクトには属性「_Person__age」がありません
これはさらに、プライベートプロパティを継承できないことを証明しています。
プライベート属性は、Pythonでは偽のプライベート属性であることがわかります。それなら、構文的にプライベートフィールドのプライバシーを保証してみませんか?最も簡単な文で:私たちは皆、ここで大人に同意しています。 Pythonプログラマーの視点として:閉じているよりも開いている方が良いです。
要約すれば:
Pythonコンパイラは、プライベートフィールドのプライバシーを厳密に保証することはできません。
サブクラスが管理下にない場合にのみ、名前の競合を回避するためにプライベート属性の使用を検討できます。
拡張の例:
#! encoding=UTF-8classA:
def __init__(self):
# プライベート属性を定義する
self.__name ="wangwu"
# 共通の属性定義
self.age =19
a =A()
# 通常の出力
print a.age
# 属性が見つからないことを確認する
print a.__name
実行出力:
Traceback (most recent call last):
File “C:\Users\lee\Documents\Aptana Studio 3 Workspace\testa\a.py”, line 19, in <module
print a.__name
AttributeError: A instance has no attribute ‘__name‘
Recommended Posts