によって(曖昧ため)、それは実際には「データは上書きが以前に割り当てられた属性を意味するチュートリアルが、残念ながらですね/同じ名前の定義されたメソッド属性とその逆:メソッド属性は、同じ名前の以前に割り当てられた/定義されたデータ属性を上書きします。
「Duh」の場合、「データ属性も同じ名前のデータの属性が上書きされていると思われるかもしれません。 (引用されたチュートリアルでの「上書き」と呼ばれる)変数への割り当て(何かの「属性」と呼ばれているかどうかに関わらず)は、命令型プログラミング言語のプロトタイプの特徴のすべてを尽くしたものです。
まあ、私は
名前空間をご紹介しましょう
Pythonのクラスは名前空間です。したがって、このチュートリアルでは、データ属性とのメソッド属性内にある内のクラスが名前空間を共有していることがわかります。
ただし、これは異なるクラスの属性には当てはまりません。クラスが別のクラスを継承する場合、そのクラスの親の名前にアクセスできます。継承クラス内のメソッド定義またはデータ割り当てに名前が再使用された場合、親クラスは元の値を保持します。子クラスでは、それらは単に一時的に隠されています。再定義別称を持つ
class A:
x = 111
class B1(A):
x = 123 # Shadows A.x
assert B1.x == 123
del B1.x # But after removing B1's own x attribute ...
assert B1.x == 111 # ... B1.x is just an alias to A.x !
# Shadowing can happen at any time:
class B2(A):
pass
assert B2.x == A.x == 111
B2.x = 5 # shadowing attributes can also be added after the class definition
assert B2.x == 5
assert A.x == 111
del B2.x
assert B2.x == A.x == 111
コントラストこの:あなたは子クラスから名前を削除した場合、それは、あまりにも、再び同じ名前の親の属性へのアクセスを提供します割り当て-RE(チュートリアルでは、それを呼び出すようまたは「上書き」):
class C:
x = 555
def x(self):
print('I am x')
C().x() # outputs "I am x"
del C.x
print(C.x) # AttributeError: 'C' object has no attribute 'x'
方法C.x()
は、一時的にデータ属性C.x
をシャドウしませんでした。それはそれを置き換えたので、メソッドを削除すると、x
はその名前の下に再表示されるデータ属性ではなく、C
の中に完全にありません。
以上の名前空間
インスタンスは、別の名前空間を追加しますので、シャドーイングのための別の機会:実際には
a = A()
assert a.x == 111 # instance namespace includes class namespace
a.x = 1000
assert a.x == 1000
assert A.x == 111 # class attribute unchanged
del a.x
assert a.x == 111 # sees A.x again
、Pythonでのすべての(ネストされた)名前空間は、そのように動作:パッケージ、モジュール、クラス、関数、メソッド、インスタンスオブジェクト、内部クラス、ネストされた関数...
変数を読み取るとき、名前空間階層は、名前が見つかるまでボトムアップされます。 (ここでは、を読むことは、変数の名前がバインドされている値(オブジェクト、関数/メソッド、またはビルトイン)を見つけることを意味し、値が変更可能な場合は、値を変更するためにも使用できます)。
オン一方、変数を設定(定義または再定義)するときは、現在の名前空間の名前が使用されます。名前が既に別の名前空間に含まれているのではなく、その名前空間にすでに存在する場合は、前に存在しなかった場合は新しく作成された名前。
変数は他の変数を隠すことができます...メソッドと属性、クラスと関数はすべて実際には変数です –