Python での授業学習ノート

WBOY
リリース: 2016-06-16 08:41:51
オリジナル
1046 人が閲覧しました

Python は、継承とポリモーフィズムをサポートするオブジェクト指向言語です。

人物クラスを定義します:

コードをコピー コードは次のとおりです:

>>> クラスの人:
... def SayHello(self):
... print('こんにちは')
...
>>> person.sayHello(なし)
こんにちは
>>> 人().sayHello()
こんにちは

person クラスのメソッドは変更可能
コードをコピー コードは次のとおりです:

>>> def hack_sayHello(obj):
... print('...こんにちは')
...
>>>
>>> person.sayHello = hack_sayHello
>>> person.sayHello(なし)
...こんにちは
>>> 人().sayHello()
...こんにちは

>>>sayHello = person().sayHello
>>>sayHello()
...こんにちは

Person().sayHello も変数に代入して直接呼び出すことができる関数です。
コードをコピーします コードは次のとおりです:
>>> 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 に似ています

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート