Pythonはオブジェクト指向プログラミング言語です。オブジェクト指向プログラミングの2つの最も基本的な概念は、クラスとオブジェクトです。クラスは、同じプロパティと関数を持つクラスのオブジェクトのグループのテンプレートであり、オブジェクトは、クラスがインスタンス化された後に生成されます。Pythonでクラスとオブジェクトを作成するのは簡単です。
18.1クラスの定義
classステートメントを使用して、新しいクラスを作成します。その後にクラス名が続き、コロンで終わります。通常は大文字で終わり
ます。以下は、クラスの例です。
class Document:
"""
这是一个文档字符串
"""
# 类变量
WELCOME_STR = 'Welcome! The context for this book is {}.'
# 初始化函数,对创建的对象进行初始化,第一个参数是self,不能有返回值
def __init__(self, title, author, context):
print('init function called')
self.title = title # 成员变量
self.author = author # 成员变量
self.__context = context # 成员变量
# 类函数,常用来实现不同的初始化函数
@classmethod
def create_empty_book(cls, title, author): # 第一参数是cls
print(cls.WELCOME_STR)
return cls(title=title, author=author, context='nothing')
# 成员函数,第一个参数必须是self
def get_context_length(self):
return len(self.__context)
# 静态函数,通常用在类内其他函数中。
@staticmethod
def get_welcome(context):
return Document.WELCOME_STR.format(context)
このクラスは、次の側面から認識できます。
- クラス名はDocumentであり、Python3の場合、すべてのクラスはデフォルトでオブジェクトクラスを継承します。
- インスタンス化されたすべてのオブジェクトに共通のクラス変数WELCOME_STRがあります。内部クラスまたは外部クラスでDocument.WELCOME_STRを使用してアクセスできます。クラス変数は、クラス内および関数本体の外で定義されます。
__init__
これは初期化関数であり、インスタンスを初期化するためにこのクラスのインスタンスが作成された直後に呼び出されます。self
すべてのインスタンスメソッドの最初のパラメータである必要があるこのクラスのインスタンスを表しますself
。__init__
は初期化関数でありself
、インスタンスオブジェクトの3つのインスタンスプロパティ、つまり、、を設定title
しauthor
ます__context
。インスタンスプロパティはクラスの特定のオブジェクトに関連しており、各オブジェクトには独自のプロパティがあり、クラス変数などのすべてのオブジェクトで共有されるわけではありません。get_context_length
はクラスのメンバーメソッドであり、その最初のパラメータはである必要がありますself
。クラス変数にアクセスでき、メンバーメソッドは通常、インスタンス化されたオブジェクトを介して呼び出されます。もちろん、クラス名を使用して呼び出すこともできますが、オブジェクトオブジェクトを渡す必要があります。create_empty_book
@classmethodで識別されるクラスのクラスメソッドであり、その最初のパラメータはである必要がありますcls
。クラスメソッドはクラス変数にアクセスでき、通常はクラス名で呼び出されます。get_welcome
これはクラスの静的メソッドであり、クラス内の他の関数で使用するように設計されていますが、クラス外のクラス名とインスタンスオブジェクトから呼び出すこともできます。
18.2クラスのインスタンス化
他のプログラミング言語では、インスタンス化されたクラスは通常、Java言語などのキーワードnewを使用します。ただし、Pythonにはそのようなキーワードはありません。クラスのインスタンス化は関数の呼び出しに似ています。クラス名は括弧で囲まれ、括弧内にはクラスの属性値があります。
以下は、クラス名Documentでインスタンス化され、__init__
メソッド。
d=Document("demo", "chunming", "show you class")
上記のステートメントは、実際にはPythonで2つのステップを実行します。
- メソッドを呼び出し
__new__
て、インスタンスオブジェクトを作成します。
上記のクラスには__new__
メソッドがありません。通常、自分で定義する必要はありません。デフォルトでは、Pythonはクラスの直接の親クラスのメソッドを呼び出して、クラス__new__
のインスタンスを構築します。クラスの親クラスに__new__
メソッドがない場合は、常にトレースバックします。このルールに従ったオブジェクトのメソッドに__new__
。Documentクラスの直接の親クラスはobjectであるため、Documentクラスがインスタンス化さ__new__
れると、objectクラスのメソッドが呼び出されます。オブジェクトのメソッドがどのように__new__
定義されているかを確認してください。
@staticmethod # known case of __new__
def __new__(cls, *more): # known special case of object.__new__
""" Create and return a new object. See help(type) for accurate signature. """
pass
可視オブジェクトのメソッド__new__
は静的メソッドであり、通常は次のように使用されます。object.__new__。
- 次に、
__init__
メソッドを使用してオブジェクトを初期化します。定義されていない場合、特別な初期化アクションは実行されません。
18.3プロパティとメソッドへのアクセス
クラスをインスタンス化した後、オブジェクトを使用して、クラス変数、インスタンスプロパティ、クラスメソッド、インスタンスメソッド、および静的メソッドにアクセスできます。
上記のクラスコードファイルに、次のテストコードを記述します。
if __name__ == '__main__':
d = Document("demo", "chunming", "show you class")
print("访问类变量=", d.WELCOME_STR) # 1.实例对象访问类变量
d0 = d.create_empty_book("有默认content", "实例对象") # 2.实例对象调用类方法
print(d.get_welcome("实例对象调用静态函数")) # 3. 实例对象调用静态方法
print(d.get_context_length()) # 4. 实例对象调用成员方法
print(Document.WELCOME_STR) # 5. 类名访问类变量
# print(Document.title) # 不可以。
print(Document.get_context_length(d)) # 6. 类名访问成员方法
f = Document.create_empty_book("static", "liu") # 7. 类名访问类方法
print(Document.get_welcome("aa")) # 8. 类名访问静态方法
クラスのプロパティとメソッドには、すべてドットを介してアクセスできます。インスタンスオブジェクトとクラスの両方が、クラス変数、クラスメソッド、インスタンスメソッド、および静的メソッドにアクセスできます。ただし、クラスはインスタンスのプロパティにアクセスできません。
18.4クラスが持つプロパティとメソッドを確認する方法
クラスのプロパティを確認する方法は2つあります。
- 最初のメソッドdir(classname)は、プロパティ名のリストを表示します。
['WELCOME_STR', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'create_empty_book', 'get_context_length', 'get_welcome']
- 2番目のメソッドclassname。
__dict__
は、属性の名前と値を含む辞書です
{'__module__': '__main__', '__doc__': '\n 这是一个文档字符串\n ', 'WELCOME_STR': 'Welcome! The context for this book is {}.', '__init__': <function Document.__init__ at 0x1101f9f80>, 'create_empty_book': <classmethod object at 0x110260750>, 'get_context_length': <function Document.get_context_length at 0x11025d710>, 'get_welcome': <staticmethod object at 0x110260790>, '__dict__': <attribute '__dict__' of 'Document' objects>, '__weakref__': <attribute '__weakref__' of 'Document' objects>}
dir関数との出力からわかるように、、など、__dict__
Documentクラスで定義されていない属性がいくつかあります。これらの属性は、Pythonによってクラスごとに自動的に設定されます。__module__
__class__
__dict__
__doc__
C.__name__
、クラスCの名前を表しますC.__dict__
、クラスCのプロパティと値を表します。C.__module__
、クラスCの定義が配置されているモジュールの名前、またはモジュールを個別に実行する場合の文字列を示します__main__
。モジュールがインポートされると、モジュールの名前に設定されます。i.__class__
、インスタンスiが属するクラスを示しますC.__bases__
、これは、親クラスの親クラスを除く、クラスCのすべての直接の親クラスのタプルを表しますC.__doc__
、クラスCのdocstringを表します。
18.5クラスのメソッド
- 工法
__init__
生成されたオブジェクトを初期化するコンストラクターと、オブジェクトの生成後に自動的に呼び出される関数を表します。
- メンバーメソッド
- 上記のコードのget_context_length関数など、オブジェクトの特定の動的機能では、関数の最初のパラメーターはselfです。
- 静的メソッド
- 関数の前の行に
@staticmethod
表現を追加します - 静的メソッドはクラスとは関係がなく、一部のタスクを個別に完了するために使用され、複数のメンバーメソッドで使用できます。
- クラスメソッド
- 最初のパラメーターは通常clsであり、クラスを渡す必要があることを示します。デコレータは宣言する
@classmethod
必要ます。 - 一般的なシナリオは、さまざまな
__init__
コンストラクターを実装することです。たとえば、上記のコードでは、create_empty_bookクラス関数を使用して新しい本オブジェクトを作成し、それによって作成される本のコンテキストは「nothing」である必要があります。
わかった。ここでは、Pythonクラスとオブジェクトの使用を開始します。次のサブセクションでは、引き続き属性の入力を紹介します。