Pythonの基礎学習入門

零下一度
リリース: 2017-07-19 23:47:44
オリジナル
1299 人が閲覧しました

Pythonでは、最初の文字が大文字の名前はクラスを指します。このクラスを空白から作成しているため、このクラス定義の大括弧は空です。このクラスの機能を説明する docstring を作成しました。クラス内の関数は メソッドと呼ばれます。

Student クラスを例に挙げます。Python では、クラスの定義はクラス キーワードによって行われます:

class Student(object):

pass

クラスの後には、クラス名。つまり Student です。クラス名は通常、大文字で始まり、その後に (オブジェクト) が続き、クラスがどのクラスから継承されているかを示します。通常、適切な継承クラスがない場合は、オブジェクト クラスが使用されます。これは、すべての継承クラスが最終的に行うことになります。

9.1.1 クラスの作成

class Student(object):

def __init__(self, name, core):

self.name = name

self.score = スコア

1. メソッド __init__() は、新しいインスタンスが作成されたときに Python が自動的に実行する特別なメソッドです。先頭と末尾に 2 つのアンダースコア があります。これは、Python のデフォルトのメソッドと通常のメソッドの間で名前の競合を避けるために設計された規則です。このメソッドの定義では、 仮パラメータ self が必須であり、他の仮パラメータ の前に配置する必要があります。

2. クラスに関連付けられた各メソッド呼び出しは、インスタンス自体への参照である実際のパラメータ self を自動的に渡し、インスタンスがクラス内のプロパティやメソッドにアクセスできるようにします。 self は自動的に渡されるため、渡す必要はありません。

3. self というプレフィックスが付いた変数は、クラス内のすべてのメソッドで使用でき、クラスの任意のインスタンスを通じてこれらの変数にアクセスすることもできます。

4.self.name= name このように、インスタンスを通じてアクセスできる変数をプロパティと呼びます

5. オブジェクト指向プログラミングの重要な機能は、データのカプセル化です。クラス内のデータにアクセスする関数を直接定義して、「データ」をカプセル化できます。データをカプセル化するこれらの関数は、Student クラス自体に関連付けられており、これをクラスのメソッドと呼びます。

9.1.2 クラスに基づいてインスタンスを作成する

通常、大文字の名前 (Dog など) は次のように考えることができます。参照するのはクラスであり、小文字の名前 (my_dog など) はクラスから作成されたインスタンスを参照します。

1. インスタンスの属性にアクセスするには、ピリオド表記を使用できます。my_dog の属性名の値にアクセスするために次のコードを書きました。

my_dog.name

ピリオド表記は Python で非常に一般的に使用されます。この構文は、Python が属性の値を学習する方法を示しています。

2. Dog クラスに基づいてインスタンスを作成した後、ピリオド表記を使用して Dog クラスで定義された任意のメソッドを呼び出すことができます。

3. 必要に応じて、クラスに基づいて任意の数のインスタンスを作成できます。

9.2 クラスとインスタンスの使用

1. 実行する必要がある重要なタスクは、インスタンスのプロパティを変更することです。インスタンスのプロパティを直接変更することも、特定の方法でプロパティを変更するメソッドを作成することもできます。

2. クラスはインスタンスを作成するためのテンプレートであり、インスタンスは各インスタンスが所有するデータは互いに独立しており、相互に影響しません。メソッドは通常の関数とは異なり、インスタンスにバインドされています。インスタンスのデータに直接アクセスします。インスタンスのメソッドを呼び出すことで、オブジェクト内のデータを直接操作しますが、メソッド内の実装の詳細を知る必要はありません。静的言語とは異なり、Python では任意のデータをインスタンス変数にバインドできます。つまり、2 つのインスタンス変数は、同じクラスの異なるインスタンスであっても、異なる変数名を持つことができます。

9.2.1 クラスの初期値を設定する

クラス内のすべての属性には、値が 0 または空の文字列であっても、初期値が必要です。デフォルト値を設定する場合など、場合によっては、属性に対してそのような初期値を指定する場合、初期値を提供する仮パラメータを含める必要はありません。価値。

クラス属性である属性をクラス内で直接定義します:

class Student(object):

name = 'Student'

プログラムを作成するときは、インスタンス属性とクラス属性に同じ名前を使用しないでください。同じ名前のインスタンス属性はクラス属性をブロックしますが、インスタンス属性を削除して同じ名前を再度使用すると、次のことが可能になります。 access はクラス属性になります。

9.2.2 属性の値を変更する

属性の値は 3 つの異なる方法で変更できます:

1. インスタンスを通じて直接変更する; 2. メソッドを通じて設定する

3. インクリメントするメソッドを通じて (特定の値を増加します)。

9.2.3 アクセス制限

1. クラス内にはプロパティとメソッドを含めることができ、外部コードはインスタンス変数のメソッドを直接呼び出すことでデータを操作できるため、複雑な内部ロジックが隠蔽されます。

2. 内部属性が外部からアクセスされないようにしたい場合は、属性名の前に 2 つのアンダースコア __ を追加できます。 Python では、インスタンスの変数名が __ で始まる場合、プライベート変数 ( private. )、内部からのみアクセスでき、外部からはアクセスできません。

class Student(object): 3. 変更後、外部コードに変更はありませんが、インスタンス変数は変更できなくなります。 __name とインスタンス変数 .__score:

def __init__(self, name, スコア):

self.__name = name

self.__score = スコア

def print_s core(self):

print('%s: %s' % (self.__name, self.__score))

>>> bart = Student('Bart Simpson', 98) 4. これにより、外部コードをランダムに使用することはできません。 アクセス制限保護によってコードがより堅牢になるように、オブジェクトの内部状態を変更します。ただし、外部コードで名前とスコアを取得したい場合は、get_name や get_score などのメソッドを Student クラスに追加できます:

>>> bart.__name

最新の最後の呼び出し ):

ファイル ""、 の 1 行目

AttributeError: 'Student' オブジェクトには属性 '__name' がありません

class Student(object): 5. 外部コードによるスコアの変更を許可したい場合は、set_score メソッドを Student に追加できます。 class:

...

def get_name(self):

return self.__name

def get_score(self):

return self.__score

class Student(object): 6. 元の直接呼び出しとの比較パラメーターをメソッド内でチェックして、無効なパラメーターを渡さないようにすることができます:

...

def set_score(self, core):

self.__score = core

class Student(object):

...

def set_score(self, core):

if 0 < ;= スコア

Else:

Raise Valueerror ('Bad Score')

7. Python では、__xxx__ に似た変数名、つまり二重アンダースコアで始まり二重アンダースコアで終わる特殊変数は、直接アクセスできる特殊変数であり、プライベート変数ではないことに注意してください。 __name__ や __score__ などの変数名は使用できません。場合によっては、_name などのアンダースコアで始まるインスタンス変数名が表示されますが、そのようなインスタンス変数は外部からアクセスできます。ただし、このような変数が表示される場合は、「アクセスできますが、どうぞ。」という意味になります。私をプライベート変数として扱い、自由にアクセスしないでください。」

8. 二重アンダースコアで始まるインスタンス変数は、必ずしも外部からアクセスできないわけではありません。 __name に直接アクセスできない理由は、Python インタープリターが外部で __name 変数を _Student__name に変更するためです。そのため、__name 変数には _Student__name を介して引き続きアクセスできます。

9.3 継承

1. クラスが別のクラスの特別なバージョンに似ている場合、継承を使用できます。クラスが別のクラスを継承すると、他のクラスのすべてのプロパティとメソッドが自動的に取得されます。元のクラスは親クラス、新しいクラスは子クラスです。

2. サブクラスは親クラスの属性とメソッドをすべて継承し、独自の属性とメソッドを定義することもできます。 OOP プログラミングでは、クラスを定義するときに、既存のクラスを継承することができます。新しいクラスはサブクラス (Subclass) と呼ばれ、継承されたクラスは基本クラス、親クラス、またはスーパークラスと呼ばれます。クラス)。

class Dog(Animal): #Inherit Animal

Pass

9.3.1 サブクラスメソッド __init__()

1. 継承では、親クラスのすべての属性に値を割り当てる必要があります。クラスの __init__() には、親クラスの助けが必要です。

2. そして親クラスは継承ファイル内で子クラスよりも前に存在する必要があります。

3. サブクラスを定義するときは、親クラスの名前を括弧内に指定する必要があります。

4.

super()特別関数は、Pythonが親クラスとサブクラスを並列接続するのに役立ちます。親クラスは、スーパーの語源であるスーパー クラスとも呼ばれます。

9.3.2 サブクラスのメソッドと属性を定義する

クラスをクラスから継承させます。サブクラスと親クラスを区別するプロパティとメソッドを追加できます。

9.3.3 親クラスの書き換え

親クラスに対応するメソッドは、サブクラスのニーズを満たさない場合にのみ書き換えることができます。サブクラスの特性を記述するために、新しいメソッドをサブクラスに追加できます。親カテゴリの最悪のものを取り除き、最良のものを採用します。

9.3.4 ポリモーフィズム

1. サブクラスと親クラスの両方に同じメソッドが存在する場合、コードの実行中は常にサブクラスのメソッドが親クラスのメソッドをオーバーライドするといいます。と呼ばれます。このようにして、継承のもう 1 つの利点、ポリモーフィズムを獲得します

2. したがって、継承関係では、インスタンスのデータ型がサブクラスの場合、そのデータ型も親クラスとみなすことができます。ただし、その逆は当てはまりません。

3. ポリモーフィズムの利点は、Dog、Cat、Tortoise... を渡す必要がある場合、Dog、Cat、Tortoise... はすべて Animal タイプであるため、Animal タイプを受け取るだけで済むことです。 、動物の種類に応じて操作できます。 Animal 型には run() メソッドがあるため、渡された型は、Animal クラスまたはサブクラスである限り、実際の型の run() メソッドを自動的に呼び出します。これがポリモーフィズムの意味です。

4. 変数の場合、それが Animal 型であることだけを知る必要があり、そのサブタイプを正確に知らなくても、安全に run() メソッドを呼び出すことができ、呼び出される特定の run() メソッドは Animal、Dog 、 Cat または Tortoise オブジェクト。実行時のオブジェクトの正確な型によって決定されます。これがポリモーフィズムの真の力です。詳細に関係なく、呼び出し元は呼び出しのみを考慮し、Animal の新しいサブクラスを追加するだけです。元のコードがどのように呼び出されたかに関係なく、 run( ) メソッドが正しく記述されていることを確認してください。これは有名な「オープンとクローズ」の原則です:

  • 拡張のために開く: 新しい Animal サブクラスを許可します;

  • 変更のために閉じます: Animal タイプに依存する run_twice() などの関数を変更する必要はありません。

9.3.5 __slots__

の使用 制限を達成するために、Python ではクラスを定義するときに特別な __slots__ 変数を定義して、クラス インスタンスに追加できる属性を制限できます。

__slots__ を使用する場合、__slots__ で定義された属性は現在のクラス インスタンスにのみ影響し、継承されたサブクラスには影響しないことに注意してください。

9.3.6 多重継承

1. 多重継承により、サブクラスは複数の親クラスのすべての機能を同時に取得できます。

2. クラスの継承関係を設計する場合、通常、主線は単一のソースから継承されます。たとえば、Ostrich は Bird から継承します。ただし、追加の機能を「組み合わせる」必要がある場合は、たとえば、Bird からの継承に加えて、Ostrich に Runnable を継承させることで実現できます。このデザインはしばしば MixIn と呼ばれます。 MixIn の目的は、クラスに複数の関数を追加することです。このように、クラスを設計するときは、複数レベルの複雑な継承関係を設計するのではなく、多重継承によって複数の MixIn 関数を組み合わせることが優先されます。

3. この方法では、異なるクラスの機能を組み合わせることを選択する限り、複雑で巨大な継承チェーンは必要ありません。必要なサブクラスを迅速に構築できます。 Python では多重継承が可能なため、MixIn が一般的な設計です。単一継承のみを許可する言語 (Java など) では、MixIn の設計を使用できません。

9.3.7 カスタマイズされたクラス

1. Python のクラスには、クラスのカスタマイズに役立つ特別な目的の関数が多数あります。

__str__

__str__() メソッドを定義すると、見栄えの良い文字列を返すことができます:

class Student(object):

__slots__ = ('name', 'age') # バインドを許可する属性名を定義するにはタプルを使用します

>>> class Student(object):

... def __init__(self, name):

... ;

>>> print(Student('Michael'))

Student オブジェクト (名前: Michael)

このようにして出力された例は、見栄えが良いだけでなく、また、インスタンス内の重要なデータを簡単に確認できるようになります。

印刷せずに変数を直接入力すると、印刷される例はまだ見栄えがよくありません:

>>> s = Student('Michael')

>>> <__main__ .Student object at 0x109afb310>

これは、直接の表示変数呼び出しが __str__() ではなく __repr__() であるためです。この 2 つの違いは、__str__() が文字列を返すことです。そして、__repr__() はプログラム開発者が見る文字列を返します。つまり、__repr__() はデバッグ用です。

解決策は、別の __repr__() を定義することです。しかし、通常、 __str__() と __repr__() のコードは同じなので、次のように怠惰に記述する方法があります:

class Student(object):

def __init__(self, name):

self .name = name def __str__(self): self.a, self .b = 0, 1 # 2 つのカウンター a, b を初期化します

リストやタプルなどの for...in ループは __iter__( ) メソッド、反復可能なオブジェクトを返します。次に、Python の for ループを実行します。 StopIteration エラーが発生してループを終了するまで、反復オブジェクトの __next__() メソッドをループ内の次の値に呼び出し続けます。

例としてフィボナッチ数列を取り上げ、for ループで使用できる Fib クラスを作成します:

class Fib(object):

def __init__(self):

def __iter__(self):

return self # インスタンス自体は反復オブジェクトなので、それ自体を返します

def __next__(self): self.a, self.b = self.b, self.a + self.b # 次の値を計算する 35

’ s ’ s ’ s ‐ ‐ ‐ ‐ 次の値へ

A # 戻る次の値

次に、for ループで FIB インスタンスを試します:

& gt & gt; fib ():

... )

...

1

1

2

...

4636875025

__getitem__

Fib インスタンスは for ループで使用でき、リストに少し似ていますが、たとえば 5 番目の要素をリストとして使用することはできません。 >> ; Fib()[5]

トレースバック (最後の呼び出し): ファイル ""、 の 1 行目

TypeError: 'Fib' オブジェクトはインデックス作成をサポートしていません

リストのように動作し、添え字で要素を取得するには、 __getitem__() メソッドを実装する必要があります:

class Fib(object):

def __getitem__(self, n): a, b = 1, 1 Python と別のメカニズム、つまり、 write one _ _getattr__() メソッドは動的に属性を返します。スコアなどの存在しない属性を呼び出す場合、Python インタプリタは __getattr__(self, 'score') を呼び出して属性を取得しようとします。これにより、スコアの値を返す機会が得られます。名前などの既存の属性は、__getattr__ では検索されません。 __call__

for x in range (n):

A, B = B, A + B

Return a

__Getattr__

1. どのクラスでも、インスタンスを直接呼び出すための __call__() メソッドを定義するだけで済みます。

2. callable() 関数を通じて、オブジェクトが「呼び出し可能な」オブジェクトであるかどうかを判断できます。

9.3.8 列挙型クラス

このような列挙型に対してクラス型を定義すると、各定数はそのクラスの一意のインスタンスになります。 Python は、この関数を実装するための Enum クラスを提供します:

from enum import Enum

Month = Enum('Month', ('Jan', 'Feb', 'Mar', 'Apr', 'May' 、'6月'、'7月'、'8月'、'9月'、'10月'、'11月'、'12月'))

9.3.9 Metaclass

type()

クラスオブジェクトを作成するには、type() 関数は 3 つのパラメータを順番に渡します:

  1. クラス名、

  2. 継承された親クラスのコレクション。多重継承をサポートします。親クラスが 1 つしかない場合は、タプルの単一要素の記述メソッドを忘れないでください。ここでは、関数 fn をメソッド名にバインドします。こんにちは。

  3. メタクラス

  4. メタクラス、文字通りメタクラスとして翻訳されます。簡単に説明すると、クラスを定義した後、このクラスに基づいてインスタンスを作成できるため、最初にクラスを定義してから、インスタンスを作成します。しかし、クラスを作成したい場合はどうすればよいでしょうか?次に、メタクラスに基づいてクラスを作成する必要があるため、最初にメタクラスを定義してからクラスを作成します。接続は次のとおりです。最初にメタクラスを定義し、次にクラスを作成し、最後にインスタンスを作成します。

__new__() メソッドによって受け取られるパラメータは次のとおりです。

現在作成中のクラスのオブジェクト

  1. クラスが継承する親クラスのコレクション。

  2. クラスメソッドのコレクション。

  3. 9.3.10 インスタンスを属性として使用する

  4. コードを使用して実際のオブジェクトをシミュレートするとき、機能や詳細をどんどん追加すると、コード ファイルだけでなく属性やメソッドも長くなり、現時点では、それらの一部を分離してクラスに再編成できます。大きなカテゴリは多くのサブカテゴリに分割できます。
  5. 9.3.11 物理オブジェクトのシミュレーション

  6. より複雑な物理オブジェクトをシミュレートするには、より高い論理レベルから考慮する必要があります。より効率的で簡潔かつ正確なコードを作成するには、クラスを定期的に再編成する必要がある場合があります。

9.4 クラスのインポート

1. クラスが追加され続けると、優れた継承でもコードが非常に長くなってしまうため、Python ではクラスをモジュールにインポートできます。そして、メインプログラムで使用するために必要なモジュールをインポートします。

2. 各モジュールのドキュメント文字列を書き、モジュールの機能を説明し、内容を簡単に説明します。

3. モジュールから複数のクラスをインポートし、カンマで区切って、必要に応じてインスタンスを作成します。

4. クラス全体をインポートし、インスタンスの前にクラス名を追加して、必要なクラスにアクセスすることもできます。

5. あるモジュールを別のモジュールにインポートします。

9.5 Python標準ライブラリ(モジュール)

Python標準ライブラリはimport文のみでインポートして利用できるモジュールの集合です。

辞書を使用すると、情報を関連付けることができますが、キーと値のペアを追加する順序は記録されません。辞書を作成し、キーと値のペアを追加する順序を記録するには、コレクションで requestedDict クラスを使用できます。モジュール。 OrderedDict のインスタンスは辞書と同じですが、キーと値のペアが追加される順序を記録します。

OrderdDictは非常に優れており、リストと辞書の両方の特性を備えており、時々必要になります。

random module

さまざまな方法で乱数を生成するための関数が含まれています。 randint() は、指定された範囲内の整数を返します。

datetime is a module

datetimeモジュールにはdatetimeクラスも含まれており、from datetime import datetimeを通じてインポートされます。 import datetime のみをインポートする場合は、完全名 datetime.datetime を引用符で囲む必要があります。

datetime.now() は現在の日付と時刻を返します。その型は datetime です。

一般的に使用されるサードパーティ ライブラリ

MySQL ドライバー: mysql-connector-python、科学計算用の NumPy ライブラリ: numpy、テキスト生成用のテンプレート ツール Jinja2 などもあります。

1.urlparseモジュール、urlpasrseモジュールは、URL文字列を処理するためのいくつかの基本的な関数を提供します。これらの関数には、urlparse()、urlunparse()、および urljoin() が含まれます。

2.urlparse()は、urlstrを6つのタプル(prot_sch、net_loc、path、params、query、frag)に解析します。ここでの各コンポーネントについては以前に説明したとおりです。

3. urlunparse()の関数はurlpase()の関数とは全く逆で、urlparse()、splicesで処理されたURLからurltupの6タプル(prot_sch、net_loc、path、params、query、frag)を生成します。それを URL に変換して を返します。

4. urllib モジュールは、指定された URL からデータをダウンロードするために使用できる多くの関数を提供します。また、文字列を URL 内で正しい形式で表示できるように、文字列をエンコードおよびデコードすることもできます。以下に紹介する関数には、urlopen()、urlretrieve()、quote()、unquote()、quote_plus()、unquote_plus()、および urlencode() が含まれます。

5.urlopen()は、指定されたURL文字列で表されるWeb接続を開き、ファイルタイプのオブジェクトを返します。

6.urlretrieve() は、ファイル形式で URL にアクセスして開くのではなく、完全な HTML をダウンロードしてファイルとして保存するために使用されます。

9.6 クラスのコーディングスタイル

特にプログラムが複雑な場合、クラスに関連するコーディングスタイルに慣れてください。

1. クラス名には

キャメルケースの命名方法

を使用する必要があります。つまり、クラスの最初の文字はアンダースコアなしで大文字にし、インスタンス名とモジュール名の最初の文字は小文字にし、接続にアンダースコアを使用します。言葉。

2. 各クラス定義の後にドキュメント文字列の説明を追加してクラスの機能を簡単に説明し、各モジュールの下にドキュメント文字列の説明を追加して、そのモジュールの下のクラスができることを簡単に説明します。

3. 空白行を使用してコードを整理しますが、乱用しないでください。クラス内のメソッドを区切るために 1 つの空白行を使用したり、クラスを区切るために 2 つの空白行を使用したりできます。

4. 標準ライブラリのモジュールと自分で書いたモジュールを同時にインポートする必要がある場合は、標準ライブラリのモジュールをインポートするインポート文を空行で区切って記述し、次に記述したモジュールのインポート文をインポートします。自分で。複数の import ステートメントが含まれていると、プログラム内の各モジュールの起源を理解しやすくなります。

以上がPythonの基礎学習入門の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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