以前書いたものをなおしています。まだ完成していません。
“Everything is an object in Python.” と言われるように、Pythonは、Object Oriented Programmingに分類されます。
OOPについては、Classesは設計図で、これにしたがってobjecsが作られますというような説明の仕方が多いと思います。具体例をあげて説明されるとそれなりにわかるとしても、OOPのどこがそんなに優れているのかがはっきりしません。
むしろ、次のように身近なPythonのobjectsがどのような性質をもっているのかから説明したほうがわかりやすいと思います。
これを参考にして、objectsとclassesについて理解を深めます。
冒頭でのべたように、Pythonではほとんどすべてがobectですから、例えば、“5”もobjectです。
Objectsは、特性(attributes)と機能(methods)を持っています。例えば、ハサミが色や材質などの特性と切れるという機能をもっているのに似ています。
Objectsがどのようなattributesとmethodsを持っているかを示す関数はdir( )です。5に適応すつと長いリストになります。それぞれないを意味するかをわかる必要がありませんが、初めの__で両側をはさまれているのがdunder(double underscoreの意味)methodsです。四則の計算の他にも多くのmethodsがあることがわかります。
dir(5)
## ['__abs__', '__add__', '__and__', '__bool__', '__ceil__', '__class__', '__delattr__', '__dir__', '__divmod__', '__doc__', '__eq__', '__float__', '__floor__', '__floordiv__', '__format__', '__ge__', '__getattribute__', '__getnewargs__', '__gt__', '__hash__', '__index__', '__init__', '__init_subclass__', '__int__', '__invert__', '__le__', '__lshift__', '__lt__', '__mod__', '__mul__', '__ne__', '__neg__', '__new__', '__or__', '__pos__', '__pow__', '__radd__', '__rand__', '__rdivmod__', '__reduce__', '__reduce_ex__', '__repr__', '__rfloordiv__', '__rlshift__', '__rmod__', '__rmul__', '__ror__', '__round__', '__rpow__', '__rrshift__', '__rshift__', '__rsub__', '__rtruediv__', '__rxor__', '__setattr__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', '__truediv__', '__trunc__', '__xor__', 'as_integer_ratio', 'bit_length', 'conjugate', 'denominator', 'from_bytes', 'imag', 'numerator', 'real', 'to_bytes']
次に文字にdir( )を実行してみましょう。これも長いリストになりますが、dunder methodsは5より少ないことがわかります。5には’__len__’はありませんでしたが、’book’にはあります。
dir('books')
## ['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'capitalize', 'casefold', 'center', 'count', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'format_map', 'index', 'isalnum', 'isalpha', 'isascii', 'isdecimal', 'isdigit', 'isidentifier', 'islower', 'isnumeric', 'isprintable', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'maketrans', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']
それぞれにlen( )を実行します。
5の場合はエラーとなり、整数にはlen( )を適用できないとコメントされます。
booksの場合は次のように文字数が返されます。
len('books')
## 5
このように実は、objectsは単なる数や文字ではなく、dataとattributesとmethodsを持つ複雑なものです。
5に3を加えます。
通常のように計算できます。
5+3
## 8
次のようにmethodで加えることもできます。
number = 5
number.__add__(3)
## 8
Pythonでは、このように数も文字も多くのmethodsとattributesを持っており、それをobjectsとしてまとめていることがわかりました。
このようにまとめてObjectsとして表現することで、簡潔で理解しやすいスクリプトになることがわかります。
上に取り上げた5やbooksはobjectsは、それぞれの整数class、文字列classより作られます。
また、Pythonでは新たにclassを作成することもできます。では、具体的にclassを作ってみましょう。
車のclassを作成して、classとobjectの関係を説明します。
class Car:
speed = 0
started = False
def start(self):
self.started = True
print("Car started, let's ride!")
def increase_speed(self, delta):
if self.started:
self.speed = self.speed + delta
print('Vrooooom!')
else:
print("You need to start the car first")
def stop(self):
self.speed = 0
print('Halting')
上に定義したCarというClassからcar_aというobjectを作成し、dir( )を実行します。
car_a = Car()
dir(car_a)
## ['__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__', 'increase_speed', 'speed', 'start', 'started', 'stop']
methodsを適応します。
car_a.start()
## Car started, let's ride!
car_a.increase_speed(50)
## Vrooooom!
To be continued.