Python - オブジェクトとクラス

クラス

Python の クラス (class) は次のように定義します。クラス名は慣習的に大文字で始めます。

class MyClass:
    """A simple example class""" # ドキュメントストリング

    def __init__(self):          # コンストラクタ
        self.name = ""

    def getName(self):           # getName()メソッド
        return self.name

    def setName(self, name):     # setName()メソッド
        self.name = name

a = MyClass()                    # クラスのインスタンスを生成
a.setName("Tanaka")              # setName()メソッドをコール
print a.getName()                # getName()メソッドをコール
Python の クラス (class)

クラス変数とインスタンス変数

クラスは、インスタンス変数クラス変数を持つことができます。インスタンス変数は「インスタンス.変数名」で表され、インスタンス毎に独立の変数です。

class MyClass:
    def __init__(self):
        self.name = "" # インスタンス変数

a1 = MyClass()
a1.name = "Tanaka"

a2 = MyClass()
a2.name = "Suzuki"

print a1.name          # Tanaka
print a2.name          # Suzuki
インスタンス変数

クラス変数は「クラス名.変数名」で表され、すべてのインスタンスで共通の変数です。

class MyClass:
    PI = 3.14    # クラス変数

print MyClass.PI # 3.14
クラス変数

ただし、インスタンス変数が存在しない場合、「インスタンス.変数名」はクラス変数を参照します。「インスタンス.変数名」に値を代入した時点でインスタンス変数が生成され、以降はインスタンス変数が参照されます。

class MyClass:
    PI = 3.14

a1 = MyClass()

print a1.PI      # クラス変数 MyClass.PI(3.14) が参照される
a1.PI = 3.141593 # インスタンス変数 a1.PI が生成される
print a1.PI      # インスタンス変数 a1.PI(3.141593) が参照される
クラス変数とインスタンス変数

メソッド

クラスが持つ関数はメソッドと呼びます。メソッドは、どこからでも参照可能です。メソッドの第一引数にはクラスのインスタンスを指定し、第二引数以降でメソッドの引数を受け取ります。

class MyClass:
    name = ""
    def setName(self, name): # 第一引数は自インスタンス(self)
        self.name = name

a = MyClass()
a.setName("Tanaka")
メソッド

アクセス制限

Python では privateprotected などのアクセス修飾子はサポートされていません。アンダーバー _ で始まる変数や関数は外から参照しない慣習的なルールがあります。アクセス制限を行う場合はアンダーバー 2 個 __ で始まる変数や関数は参照が制限されます。

class MyClass:
    def __init__(self):
        self.name = "tanaka"
        self._name = "yamada"
        self.__name = "suzuki"

    def hello(self): print 'hello'
    def _hello(self): print 'hello'
    def __hello(self): print 'hello'

a = MyClass()

print a.name            # 参照できる
print a._name           # 参照できるが慣習的に参照しない
# print a.__name        # 参照できない(AttributeError例外)

a.hello()               # 参照できる
a._hello()              # 参照できるが慣習的に参照しない
# a.__hello()           # 参照できない(AttributeError例外)
アクセス制限

コンストラクタ

__init__() メソッドは、クラスのインスタンスが生成された際に呼び出され、コンストラクタと呼びます。

class MyClass:
    def __init__(self, name):
        self.name = name
    def getName(self):
        return self.name

a = MyClass("Tanaka")
print a.getName() # Tanaka
コンストラクタ

デストラクタ

__del__() メソッドは、クラスのインスタンスが消滅する際に呼び出され、デストラクタと呼びます。

class MyClass:
    def __init__(self):
        print "INIT!"
    def __del__(self):
        print "DEL!"

a = MyClass() # INIT!
del a         # DEL!
デストラクタ

文字列化

__str__() メソッドは、インスタンスを暗黙的に文字列に変換する際の変換処理を定義します。

class MyClass:
    def __init__(self, name):
        self.name = name

    def __str__(self):
        return "My name is " + self.name

a = MyClass("Yamada")
print a # My name is Yamada
文字列化

継承

他のオブジェクト指向言語と同様、Python でもクラスを継承することもできます。下記の例では MyClass クラスを継承した MyClass2 サブクラスを定義しています。サブクラスでは、親クラスが持つ変数やメソッドを継承して利用することができます。

class MyClass:
    def hello(self):
        print "Hello"

class MyClass2(MyClass):
    def world(self):
        print "World"

a = MyClass2()
a.hello() # Hello
a.world() # World
継承

サブクラスでは、親クラスのメソッドを上書きすることができます。

class MyClass:
    def hello(self):
        print "Hello"

class MyClass2(MyClass):
    def hello(self):        # 親クラスの hello() メソッドを上書き
        print "HELLO"

a = MyClass2()
a.hello()                   # HELLO
継承

スーパークラス

super() は、親クラス (スーパークラス) を参照します。第一引数にはクラス、第二引数にはインスタンスを指定します。下記の例では、サブクラスのコンストラクタの中で親クラスのコンストラクタを呼び出しています。

class MyClass1(object):
    def __init__(self):
       self.val1 = 123

class MyClass2(MyClass1):
    def __init__(self):
        super(MyClass2, self).__init__()
        self.val2 = 456

a = MyClass2()
print a.val1 # 123
print a.val2 # 456
スーパークラス

多重継承

Python では多重継承がサポートされています。下記では、MyClassA, MyClassB 両方を継承する MyClassC を定義しています。

class MyClassA:
    def funcA(self):
        print "MyClassA:funcA"

class MyClassB:
    def funcB(self):
        print "MyClassB:funcB"

class MyClassC(MyClassA, MyClassB):
    pass

a = MyClassC()
a.funcA() # MyClassA のメソッドが使用できる
a.funcB() # MyClassB のメソッドも使用できる
多重継承

関連記事

Python 全体の仕様を体系的にまとめたページは、プログラミング Python 入門を参照してください。

Category:
プログラミング
公開日:
更新日:
Pageviews:
26
Shares:
1
Tag:
Python
hatebu icon
hatebu