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)