@blog.justoneplanet.info

日々勉強

Pythonでクラスを定義する

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)

コメントはまだありません»

No comments yet.

RSS feed for comments on this post.TrackBack URL

Leave a comment