Python2覚書 クラスの定義

下のひな形から、クラス定義に関する文法をチェックしてみます。

クラス名
可視性属性名
可視性メソッド名(引数名:引数型)返却値型





Person
publicnick_nameString
publicgreet( )





Person
private__nameString
publicsmile(num:Number)
private__face(num:Number)


class Person:
    #nick_name=""

    def __init__(self, name):
        self.nick_name = name  
  
    def greet(self):
        print "I'm " + self.nick_name

he = Person("tenor_p")
she = Person("soprano_p")

he.nick_name="tenor_p"
she.nick_name="soprano_p"

he.greet()
she.greet()

class Person:
    #__name = ""
    def __init__(self, name):
        self.__name = name
    
    def smile(self, num):
        print self.__name
        self.__face(num)
    
    def __face(self , num):
        print ":) " * num

she = Person("Alice")
he = Person("Bob")

he.smile(5)
she.smile(5)


I'm tenor_p
I'm soprano_p


Bob
:) :) :) :) :)
Alice
:) :) :) :) :)

クラスの定義

外部からアクセスできるメンバはクラス内でそのまま定義します。メソッドの引数には自分自身の参照を表す"self"を記述します。

def smile(self, num): 

クラス内でメンバにアクセスする場合は"self."を付けます。

self.nick_name = name
self.smile(3)

データの隠蔽

外部から隠蔽したいメンバは"__"を変数・関数名に付けて定義します。

class Person:
    __name = ""
    def __face(self , num):

初期化メソッド

インスタンスが生成された時に呼び出される初期化メソッド(コンストラクタ)は、"__init__"で定義することができます。

    def __init__(self, name):
        self.nick_name = name    

インスタンスの生成

he = Person("Alice")
she = Person("Bob")

インスタンスの利用

"."を使って外部からインスタンスのメンバにアクセスすることができます。呼び出し側の引数ではselfを省きます。

he.nick_name="tenor_san"
she.nick_name="soprano_san"
he.smile(5)
she.smile(5)

メンバ変数の追加

Pythonでは、メンバ変数やメンバ関数インスタンス化した後にも追加することができます。例えば上の例で、インスタンスheを生成したあと、

he.new_att = 3

とすると、heインスタンスに新たな属性new_attを追加することができます。

print he.new_att #OK

しかし、インスタンスheにメンバを追加してもsheには追加されていません。

print she.new_att #compile error

Personクラスそのものに後からメンバを追加すると、生成したインスタンスにもその時点でメンバが追加されます。

Person.new_att = 3
print he.new_att  #OK
print she.new_att #OK

メンバ関数の追加

メンバ関数もクラス宣言の外から追加できます。

def new_method(self):
    print "new method"

Person.new_method = new_method

メンバ関数を追加する前に生成したインスタンスにも一様に追加されるようです。

she=Person("Alice")
he=Person("Bob")

def new_method(self):
    print "new method"
Person.new_method = new_method

she.new_method()
he.new_method()


new method
new method