>>> person.sayHello は Person().sayHello
です。
誤り
>>> 人.sayHello == 人().sayHello
誤り
直感的には、 Person.sayHello と Person().sayhello は同じオブジェクトではありません。 Person().sayHello は Person インスタンスに関連付けられ (バインドされ)、 Person.sayHello は
クラス メソッドです。
実際、self パラメータはメソッドと関数の違いです。メソッドは最初のパラメータをそのメソッドが属するインスタンスにバインドするため、このパラメータを指定する必要はありません。
コードをコピーします
コードは次のとおりです:
>>> クラスの人:
... 名前 = '不明'
... def SayHello(self):
... print('私' + 名前)
...
>>>
>>> person.sayHello(なし)
トレースバック (最後の呼び出し):
ファイル「
」、1 行目、
ファイル「」、行 4、sayHello
NameError: 名前「name」が定義されていません
>>> p = 人()
>>> p.name = 'wyj'
>>> p.sayHello()
トレースバック (最後の呼び出し):
ファイル「」、1 行目、
ファイル「」、行 4、sayHello
NameError: 名前「name」が定義されていません
Python が変数を解析するとき、デフォルトではローカル スコープ/グローバル スコープから検索することがわかります。
コードをコピーします
コードは次のとおりです:
>>> クラスの人:
... 名前 = '不明'
... def SayHello(self):
... print('i'm ' + self.name)
...
>>>
>>> person.sayHello(なし)
トレースバック (最後の呼び出し):
ファイル「
」、1 行目、
ファイル「」、行 4、sayHello
AttributeError: 'NoneType' オブジェクトには属性 'name' がありません
>>> p = 人()
>>> p.name = 'wyj'
>>> p.sayHello()
私はワイです
メンバーへのアクセスは self を経由する必要があります。name 属性を含むオブジェクトで person.sayHello(obj) が呼び出された場合、問題ありませんか?
コードをコピー
コードは次のとおりです:
>>> クラス猫:
... 名前 = 'フアンフアン'
...
>>> person.sayHello(Cat())
私はフアンフアン
です
はい、Python は同じクラスのインスタンス オブジェクトをパラメータとしてクラス メソッドを呼び出すことを制限しません (Python のクラス メカニズムは Javascript に似ているようです)。
アクセス制御
Python はプライベート パーティ アクセスを直接サポートしていませんが、それを制御するかどうかはプログラマーの責任です。
ただし、属性名の前に二重アンダースコアを追加して、プライベート アクセスを与えることができます (外部からは見えません)。
コードをコピー
コードは次のとおりです:
>>> クラスの人:
... def __private_method(self):
... print('プライベート')
... def テスト(自己):
... self.__private_method()
...
>>> 人().test()
プライベート
>>> 人().__private_method()
トレースバック (最後の呼び出し):
ファイル「
」、1 行目、
AttributeError: 'person' オブジェクトには属性 '__private_method' がありません
実際、上記のアンダースコアで始まるすべてのメソッドには、_ClassName__methodName メソッド
があります。
コードをコピー コードは次のとおりです:
>>> person._person__private_method
<関数 Person.__private_method at 0x7fed431a2d90>
に電話する
コードをコピー コードは次のとおりです:
>>> person._person__private_method(なし)
プライベート
つまり、Python はクラス外からのメソッド呼び出しを妨げません
。
クラス属性とオブジェクト属性
まず、クラスに属性を追加すると、新しいオブジェクトが属性のコピーを取得します
コードをコピー コードは次のとおりです:
>>> 年齢 = 3
>>> 人().年齢
3
>>> 年齢 = 4
>>> 人().年齢
4
>>> p = 人()
>>> 年齢 = 31
>>> ページ
31
クラス属性への変更は、以前に生成されたオブジェクトの属性に反映されます。つまり、クラス属性とオブジェクト属性は値を共有します。
コードをコピー コードは次のとおりです:
>>> ページ = 34
>>> ページ
34
>>> 年齢
31
>>> 年齢 = 99
>>> ページ
34
オブジェクトのプロパティが変更されると、オブジェクトのプロパティは独自の値を持つようになり、クラスのプロパティには反映されなくなり、クラスのプロパティの変更はオブジェクトのプロパティに反映されなくなります。 ;
この動作は Javascript に似ています