Python オブジェクトとクラス
Python オブジェクトとクラス
このチュートリアルでは、Python オブジェクトとクラスのコア機能について学習します。クラスとは何か、それを作成してプログラムで使用する方法を学びます。
ビデオ:Python クラスとオブジェクト
Python オブジェクトとクラス
Python はオブジェクト指向のプログラミング言語です。主な重点が機能にある手続き指向プログラミングとは異なり、オブジェクト指向プログラミングはオブジェクトに重点を置いています。
オブジェクトは、単にデータ (変数) とそれらのデータに作用するメソッド (関数) の集まりです。同様に、クラスはそのオブジェクトの設計図です。
クラスは家のスケッチ(プロトタイプ)と考えることができます。床、ドア、窓などに関するすべての詳細が含まれています。これらの説明に基づいて家を建てます。家がオブジェクトです。
家の設計図から多くの家を作成できるように、クラスから多くのオブジェクトを作成できます。オブジェクトはクラスのインスタンスとも呼ばれ、このオブジェクトを作成するプロセスはインスタンス化と呼ばれます .
Python でクラスを定義する
関数定義が Python の def キーワードで始まるように、クラス定義は class キーワードで始まります。
クラス内の最初の文字列は docstring と呼ばれ、クラスの簡単な説明が含まれています。必須ではありませんが、強くお勧めします。
以下は簡単なクラス定義です。
class MyNewClass:
'''This is a docstring. I have created a new class'''
pass
クラスは、そのすべての属性が定義されている新しいローカル名前空間を作成します。属性はデータまたは関数の場合があります。
2 つのアンダースコア __
で始まる特別な属性もあります。 .例:__doc__
そのクラスの docstring を返します。
クラスを定義するとすぐに、新しいクラス オブジェクトが同じ名前で作成されます。このクラス オブジェクトを使用すると、さまざまな属性にアクセスしたり、そのクラスの新しいオブジェクトをインスタンス化したりできます。
class Person:
"This is a person class"
age = 10
def greet(self):
print('Hello')
# Output: 10
print(Person.age)
# Output: <function Person.greet>
print(Person.greet)
# Output: "This is a person class"
print(Person.__doc__)
出力
10 <function Person.greet at 0x7fc78c6e8160> This is a person class
Python でオブジェクトを作成する
クラス オブジェクトを使用してさまざまな属性にアクセスできることがわかりました。
また、そのクラスの新しいオブジェクト インスタンス (インスタンス化) を作成するためにも使用できます。オブジェクトを作成する手順は、関数呼び出しに似ています。
>>> harry = Person()
これにより、harry という名前の新しいオブジェクト インスタンスが作成されます .オブジェクト名のプレフィックスを使用して、オブジェクトの属性にアクセスできます。
属性は、データまたはメソッドの場合があります。オブジェクトのメソッドは、そのクラスの対応する関数です。
これは、Person.greet
からということです 関数オブジェクト (クラスの属性)、Person.greet
メソッドオブジェクトになります。
class Person:
"This is a person class"
age = 10
def greet(self):
print('Hello')
# create a new object of Person class
harry = Person()
# Output: <function Person.greet>
print(Person.greet)
# Output: <bound method Person.greet of <__main__.Person object>>
print(harry.greet)
# Calling object's greet() method
# Output: Hello
harry.greet()
出力
<function Person.greet at 0x7fd288e4e160> <bound method Person.greet of <__main__.Person object at 0x7fd288e9fa30>> Hello
self
に気づいたかもしれません クラス内の関数定義のパラメーターですが、メソッドを単に harry.greet()
として呼び出しました 引数なし。それでも機能しました。
これは、オブジェクトがそのメソッドを呼び出すたびに、オブジェクト自体が最初の引数として渡されるためです。つまり、harry.greet()
Person.greet(harry)
に変換されます .
一般に、n 個の引数のリストを使用してメソッドを呼び出すことは、最初の引数の前にメソッドのオブジェクトを挿入して作成された引数リストを使用して、対応する関数を呼び出すことと同じです。
これらの理由から、クラス内の関数の最初の引数はオブジェクト自体でなければなりません。これは慣習的に self と呼ばれます .別の名前を付けることもできますが、規則に従うことを強くお勧めします。
ここで、クラス オブジェクト、インスタンス オブジェクト、関数オブジェクト、メソッド オブジェクト、およびそれらの違いについて理解する必要があります。
Python のコンストラクタ
二重下線 __
で始まるクラス関数 特別な意味を持つため、特別な機能と呼ばれます。
特に興味深いのは __init__()
です 関数。この特別な関数は、そのクラスの新しいオブジェクトがインスタンス化されるたびに呼び出されます。
このタイプの関数は、オブジェクト指向プログラミング (OOP) ではコンストラクターとも呼ばれます。通常、すべての変数を初期化するために使用します。
class ComplexNumber:
def __init__(self, r=0, i=0):
self.real = r
self.imag = i
def get_data(self):
print(f'{self.real}+{self.imag}j')
# Create a new ComplexNumber object
num1 = ComplexNumber(2, 3)
# Call get_data() method
# Output: 2+3j
num1.get_data()
# Create another ComplexNumber object
# and create a new attribute 'attr'
num2 = ComplexNumber(5)
num2.attr = 10
# Output: (5, 0, 10)
print((num2.real, num2.imag, num2.attr))
# but c1 object doesn't have attribute 'attr'
# AttributeError: 'ComplexNumber' object has no attribute 'attr'
print(num1.attr)
出力
2+3j (5, 0, 10) Traceback (most recent call last): File "<string>", line 27, in <module> print(num1.attr) AttributeError: 'ComplexNumber' object has no attribute 'attr'
上記の例では、複素数を表す新しいクラスを定義しました。 __init__()
の 2 つの機能があります。 変数 (デフォルトはゼロ) と get_data()
を初期化します 番号を正しく表示するために。
上記のステップで注目すべき興味深い点は、オブジェクトの属性をオンザフライで作成できることです。新しい属性 attr を作成しました オブジェクト num2 用 そしてそれも読んでください。しかし、これはオブジェクト num1 の属性を作成しません .
属性とオブジェクトの削除
del
を使用して、オブジェクトの属性をいつでも削除できます。 声明。出力を確認するには、Python シェルで次のことを試してください。
>>> num1 = ComplexNumber(2,3)
>>> del num1.imag
>>> num1.get_data()
Traceback (most recent call last):
...
AttributeError: 'ComplexNumber' object has no attribute 'imag'
>>> del ComplexNumber.get_data
>>> num1.get_data()
Traceback (most recent call last):
...
AttributeError: 'ComplexNumber' object has no attribute 'get_data'
del ステートメントを使用して、オブジェクト自体を削除することもできます。
>>> c1 = ComplexNumber(1,3)
>>> del c1
>>> c1
Traceback (most recent call last):
...
NameError: name 'c1' is not defined
実際には、それよりも複雑です。 c1 = ComplexNumber(1,3)
を実行すると 、新しいインスタンス オブジェクトがメモリ内に作成され、c1 という名前が付けられます
コマンド del c1
について 、このバインディングが削除され、名前 c1 対応する名前空間から削除されます。ただし、オブジェクトはメモリ内に存在し続け、他の名前がバインドされていない場合は、後で自動的に破棄されます。
この Python での参照されていないオブジェクトの自動破棄は、ガベージ コレクションとも呼ばれます。
<図>Python