Pythonでclassを定義するには以下のように記述する。
class Dog: name = '' def __init__(self, name): self.name = name def cry(self): print(self.name) dog = Dog('pochi') dog.cry()#pochi
■継承
Pythonでclassを継承するには以下のように記述する。
class Animal: name = '' def __init__(self, name): self.name = name class Dog(Animal): talk = 'bow!' def cry(self): print('this is ' + self.name + '! ' + self.talk) class Cat(Animal): talk = 'mew!' def cry(self): print('this is ' + self.name + '! ' + self.talk) dog = Dog('pochi') dog.cry()#this is pochi! bow! cat = Cat('doraemon') cat.cry()#this is doraemon! mew!
■多重継承
Pythonは多重継承をサポートした言語である。自分の中では初めての多重継承((o(^-^)o))。以下のような記述になる。
class Robot: color = '' def __init__(self, color): self.color = color class Cat: name = '' def __init__(self, name): self.name = name def cry(self): print('mew!') class Doraemon(Robot, Cat): name = 'Doraemon' def intro(self): print('My name is ' + self.name + '(' + self.color + ')!') doraemon = Doraemon('blue') doraemon.intro()#My name is Doraemon(blue)! doraemon.cry()#mew! doraemon.name#Draemon
ドラえもんクラスを作って考えてみることにした。まず、ドラえもんはロボットなので以下のようなRobotクラスを作る。
class Robot: color = '' def __init__(self, color): self.color = color
ドラえもんはネコ型なのでCatクラスも継承するはずなので、以下のように定義する。
class Cat: name = '' def __init__(self, name): self.name = name def cry(self): print('mew!')
以下のようにドラえもんは量産型なのでクラス化して、RobotクラスとCatクラスを継承する、
class Doraemon(Robot, Cat): name = 'Doraemon' def intro(self): print('My name is ' + self.name + '(' + self.color + ')!')
以下のように、Draemonクラスをインスタンス化して使ってみるする。
doraemon = Doraemon('blue') doraemon.intro()#My name is Doraemon(blue)! doraemon.cry()#mew doraemon.name#Draemon
上述のDaraemonクラスにはコンストラクタが存在しない。このような場合の解決規則は、(継承を記述した部分で)左から右へ探索し解決される。多重継承は非常に注意して使わないと分かりにくくなる。従って多重継承をサポートしない言語が多いということがある。
■プライベート変数
name変数は外から変更できないほうが良い。従って以下のようにアンダースコアを2つ続けて書くことでプライベートにする。
class Dog: __name = '' __counter = 0 def __init__(self, name): self.__name = name def cry(self): print('This is ' + self.__name + '(' + str(self.__counter) + ')') self.__count() def __count(self): self.__counter = self.__counter + 1 dog = Dog('pochi') dog.cry()#This is pochi(0) dog.__name#error dog.__count()#error dog.cry()#This is pochi(1)
上述の通り、プライベートになり外からアクセスすることが出来なくなる。しかし、Pythonはプライベート変数に外から強引にアクセスすることもできる言語仕様だ。
class Dog: __name = '' __counter = 0 def __init__(self, name): self.__name = name def cry(self): print('This is ' + self.__name + '(' + str(self.__counter) + ')') self.__count() def __count(self): self.__counter = self.__counter + 1 dog = Dog('pochi') dog.cry()#This is pochi(0) dog._Dog__name#pochi dog._Dog__count() dog.cry()#This is pochi(2)
■クラスの入れ子
Javaと同じようにPythonではクラスを入れ子にすることができる。ちなみにPHPではできない。
class Hoge: class Hoge1: def __init__(self): print 'hoge1' class Hoge2: def __init__(self): print 'hoge2' hoge = Hoge() hoge1 = hoge.Hoge1()# hoge1 hoge2 = hoge.Hoge2()#hoge2
最近心変わりがあって行末にセミコロンを打つのをやめた。(o→ܫ←o)