【Python入門】クラスの文法 継承について- Python初心者勉強記025
今回も引き続きクラスの文法について見ていきましょう。
クラスに関わる文法
クラス属性
クラス属性は、クラス自身が保有する属性で、個々のインスタンスにおいて共有されます。
クラス属性の値を変更すると全てのインスタンスに影響を及ぼします。
>>> class Myclass(object):
... num=1
...
>>> ins1 = Myclass()
>>> ins2 = Myclass()
>>> ins1.num,ins2.num
(1, 1)
>>> Myclass.num=2
>>> ins1.num,ins2.num
(2, 2)
クラス・メソッドとスタティックメソッド
クラス・メソッドは、メソッド内でクラス自身を参照できるメソッドです。メソッドの第1引数にはそのクラス自体(「cls」)が自動的に渡され、第2引数以降にメソッド呼び出し時の引数が順に渡されます。
スタティック・メソッドはクラスの属性である以外は、他のグローバルな関数と変わりません。
これらは以下のように書きます。
@classmethod
@staticmethod
>>> class Myclass(object):
... def __init__(self,country_id):
... self.country_id=country_id
... @classmethod #クラスメソッドの実装
... def create_from_country_name(cls,country):
... country_id={'Japan':0,'US':1}[country]
... return cls(country_id) #Myclassクラスのインスタンスを返す
... @staticmethod #スタティックメソッドの実装
... def get_id(country):
... country_id={'Japan':0,'US':1}[country]
... return country_id
...
>>> c1 = Myclass.create_from_country_name('Japan')#クラスメソッドの実行
>>> c1.country_id
0
>>> Myclass.get_id('US')#スタティックメソッドの実行
1
継承
継承を用いることで、既存のクラスから属性を受け継いで、それらを変更・拡張したクラスを定義することができます。
一般的な継承
継承の例として、Solidクラスを継承したCubeクラスとBallクラスを作成してみます。
>>> class Solid(object):
... def __init__(self,width):
... self.width = width
... def calculate_volume(self):
... return 0
...
>>> class Cube(Solid):
... def calculate_volume(self):
... return self.width * self.width * self.width #立方体の体積を返す
...
>>> class Cube(Solid):
... def calculate_volume(self):
... import math
... return math.pi * math.pow(self.width,3) #球の体積を返す
...
CubeクラスとBallクラスはSolidクラスの__init__メソッドを利用して初期化されます。
一方calculate_volumeメソッドはsolidクラスとballクラスでそれぞれ再定義されているので、出力が異なります。
継承元のメソッド呼び出し
継承元のメソッドを呼び出すには、super関数を利用します。「super(クラス,self).メソッド(...)」という形式で呼び出すと、そのクラスの親クラスで定義されたメソッドを呼び出されます。>>> class Solid(object): ... def __init__(self,width): ... self.width=width ... ... >>> class Rectangular(Solid): ... def __init__(self,width,height): ... super(Rectangular,self).__init__(width) #Solidのinitを呼び出す ... self.height=height ... >>> rec = Rectangular(3,1) >>> rec.width,rec.height (3, 1)
抽象クラス
抽象クラスとは、継承先で「必ず実装されなければならないメソッド」が少なくとも1つ含まれている、いわば未完成のクラスのことです。
Pythonではこの抽象クラスは用意されていませんが、標準モジュールの'abc'を用いて抽象クラスを実装することができます。
まず、「__metaclass__」の部分でabc.ABCMetaクラスをメタクラスに指定します。次に「abc.abstractmethod」というデコレーターで抽象メソッドを指定します。>>> class Solid(object): ... __metaclass__ = abc.ABCMeta ... @abc.abstractmethod ... def calcurate_volume(self): ... return ... >>> Solid() #抽象メソッドがあるクラスをインスタンス化しようとするとエラーになる Traceback (most recent call last): File "
", line 1, in TypeError: Can't instantiate abstract class Solid with abstract methods calcurate_volume 多重継承
Pythonでは、複数のクラスから継承する、多重継承を行うことができます。
多重継承の中でもよく行われるのは、クラスの機能を追加することも目的としたMixinです。>>> class Solid(object): ... def __init__(self,width): ... self.width=width ... def calculate_volume(self): ... return 0 ... >>> class Cube(Solid): ... def calculate_volume(self): ... return self.width * self.width * self.width ... >>> class CubeCmpMixin(object): ... def __cmp__(self,other): #比較演算子をカスタマイズする ... return self.calculate_volume() - other.calculate_volume() ... >>> class VolumeComparableCube(CubeCmpMixin,Cube): ... pass ... >>> c1 = VolumeComparableCube(3) >>> c2 = VolumeComparableCube(4) >>> c1>c2 #体積で比較 False >>> c1
Python入門講座の次の記事はこちら => 【Python入門】日時の操作方法- Python初心者勉強記026