ページへ戻る
印刷
Python/クラス定義
をテンプレートにして作成 ::
NJF Wiki
xpwiki
:Python/クラス定義 をテンプレートにして作成
開始行:
Pythonでは関数ベースでもクラスを使ったオブジェクト指向で...
小規模のツールなどでは関数のみを利用しても十分ですが、あ...
こちらではPythonのクラスについて簡単にまとめます。
*基本
クラスの定義は「class」で行います。
クラス名の後には「(obect)」を付けます。
これは省略可能ですが、継承などで一部の記法が使えなくなる...
メソッドの定義は「def」です。
コンストラクタは「__init__」で、インスタンス化に「new」は...
class TestClass(object):
def __init__(self):
print "construct!"
testClass = TestClass()
結果
construct!
また全てのメソッドは「self」を引数としなければならず、こ...
他の言語で言うところの「this」とほぼ同じです。
class TestClass(obect):
def whatIsSelf(self):
print type(self)
print self
testClass = TestClass()
testClass.whatIsSelf()
結果
<class '__main__.TestClass'>
<__main__.TestClass object at 0x10bcdb8d0>
この「self」を使ってクラス内のメソッドを呼びます。
多くの他言語の「this」と違って、省略することはできません。
class CallMethod(obect):
def method1(self):
print "method1 called"
def method2(self):
self.method1()
callMethod = CallMethod()
callMethod.method2()
結果
method1 called
クラス変数も定義できます。
クラス変数はクラス名でも「self」を含むインスタンスからで...
class ClassVariables(obect):
a = 1
b = 2
def __init__(self):
print self.b
self.a = 10
self.c = 11
classVariables = ClassVariables()
print ClassVariables.a
print classVariables.a
print classVariables.c
結果
2
1
10
11
ここでインスタンスでそのクラス変数を参照するときには、も...
言い換えれば、インスタンスの変数はメソッドで代入したとき...
これは他のprototype型のクラス定義を採用している言語と同様...
*参照の制限
Pythonではprivateなどの参照範囲を制限する修飾子はサポート...
代わりに「_」(アンダーバー)で始まる要素には慣習的にクラ...
class PrivateMethod(object):
def __method(self):
print "__method"
def _method(self):
self.__method()
privateMethod = PrivateMethod()
「_」で始まるメソッドは参照可能(ただし慣習的に参照するの...
privateMethod._method()
結果
__method
「__」で始まるメソッドはクラス内からの呼び出しは可能です...
privateMethod.__method()
結果
Traceback (most recent call last):
File "class_test.py", line 42, in <module>
privateMethod.__method()
AttributeError: PrivateMethod instance has no attribute ...
しかし、実はこれは「__」で始まるメソッドは「_クラス名メソ...
privateMethod._PrivateMethod__method()
結果
__privateMethod
つまり、Pythonには言語仕様として完全にアクセス範囲を制限...
そのため、アクセスをコントロールするには人間が気をつける...
プログラムを無駄に複雑にしないために、なるべく慣習的なス...
*継承
継承はクラス名の後の「()」の中に親クラスの名前を入れるこ...
親クラスへのアクセスはそのままクラス名を指定するか、「sup...
class ParentClass(object):
def __init__(self):
print "parent"
def printType(self):
print type(self)
class ChildClass(ParentClass):
def __init__(self):
ParentClass.__init__(self)
def printType(self):
super(ChildClass,self).printType()
childClass = ChildClass()
childClass.printType()
結果
parent
<class '__main__.ChildClass'>
「super」は親クラスの名前を知らなくても利用できるので、コ...
しかし、クラスの定義のところで、「(object)」を付けた方が...
つまり「(object)」を指定することで、Pythonのobject型を継...
Pythonでは全ての基本的なクラスは「object」を継承している...
ただし、小規模な開発でのクラス定義だと、さほどobjectを継...
また、Pythonは多重継承もサポートしています
class Class1(Class2,Class3):
...
ただし、多重継承は継承関係が複雑化したり名前の衝突が起き...
*クラスメソッドとスタティックメソッド
Pythonではクラスメソッドとスタティックメソッドの両方が使...
記法としては「@classmethod」と「@staticmethod」というアノ...
class StaticAndClassMethod(object):
@classmethod
def classMethod(cls):
print "class method"
@staticmethod
def staticMethod():
print "static method"
StaticAndClassMethod.classMethod()
StaticAndClassMethod.staticMethod()
結果
class method
static method
クラスメソッドとスタティックメソッドの違いは、第一引数に...
そのため、メソッドの中でクラスを使わないならスタティック...
しかし、クラス名を使えばスタティックメソッドから他のスタ...
使いどころとしては、似たような関数がたくさんある場合には...
しかし小規模開発なら関数の個数自体が少ないので、スタティ...
終了行:
Pythonでは関数ベースでもクラスを使ったオブジェクト指向で...
小規模のツールなどでは関数のみを利用しても十分ですが、あ...
こちらではPythonのクラスについて簡単にまとめます。
*基本
クラスの定義は「class」で行います。
クラス名の後には「(obect)」を付けます。
これは省略可能ですが、継承などで一部の記法が使えなくなる...
メソッドの定義は「def」です。
コンストラクタは「__init__」で、インスタンス化に「new」は...
class TestClass(object):
def __init__(self):
print "construct!"
testClass = TestClass()
結果
construct!
また全てのメソッドは「self」を引数としなければならず、こ...
他の言語で言うところの「this」とほぼ同じです。
class TestClass(obect):
def whatIsSelf(self):
print type(self)
print self
testClass = TestClass()
testClass.whatIsSelf()
結果
<class '__main__.TestClass'>
<__main__.TestClass object at 0x10bcdb8d0>
この「self」を使ってクラス内のメソッドを呼びます。
多くの他言語の「this」と違って、省略することはできません。
class CallMethod(obect):
def method1(self):
print "method1 called"
def method2(self):
self.method1()
callMethod = CallMethod()
callMethod.method2()
結果
method1 called
クラス変数も定義できます。
クラス変数はクラス名でも「self」を含むインスタンスからで...
class ClassVariables(obect):
a = 1
b = 2
def __init__(self):
print self.b
self.a = 10
self.c = 11
classVariables = ClassVariables()
print ClassVariables.a
print classVariables.a
print classVariables.c
結果
2
1
10
11
ここでインスタンスでそのクラス変数を参照するときには、も...
言い換えれば、インスタンスの変数はメソッドで代入したとき...
これは他のprototype型のクラス定義を採用している言語と同様...
*参照の制限
Pythonではprivateなどの参照範囲を制限する修飾子はサポート...
代わりに「_」(アンダーバー)で始まる要素には慣習的にクラ...
class PrivateMethod(object):
def __method(self):
print "__method"
def _method(self):
self.__method()
privateMethod = PrivateMethod()
「_」で始まるメソッドは参照可能(ただし慣習的に参照するの...
privateMethod._method()
結果
__method
「__」で始まるメソッドはクラス内からの呼び出しは可能です...
privateMethod.__method()
結果
Traceback (most recent call last):
File "class_test.py", line 42, in <module>
privateMethod.__method()
AttributeError: PrivateMethod instance has no attribute ...
しかし、実はこれは「__」で始まるメソッドは「_クラス名メソ...
privateMethod._PrivateMethod__method()
結果
__privateMethod
つまり、Pythonには言語仕様として完全にアクセス範囲を制限...
そのため、アクセスをコントロールするには人間が気をつける...
プログラムを無駄に複雑にしないために、なるべく慣習的なス...
*継承
継承はクラス名の後の「()」の中に親クラスの名前を入れるこ...
親クラスへのアクセスはそのままクラス名を指定するか、「sup...
class ParentClass(object):
def __init__(self):
print "parent"
def printType(self):
print type(self)
class ChildClass(ParentClass):
def __init__(self):
ParentClass.__init__(self)
def printType(self):
super(ChildClass,self).printType()
childClass = ChildClass()
childClass.printType()
結果
parent
<class '__main__.ChildClass'>
「super」は親クラスの名前を知らなくても利用できるので、コ...
しかし、クラスの定義のところで、「(object)」を付けた方が...
つまり「(object)」を指定することで、Pythonのobject型を継...
Pythonでは全ての基本的なクラスは「object」を継承している...
ただし、小規模な開発でのクラス定義だと、さほどobjectを継...
また、Pythonは多重継承もサポートしています
class Class1(Class2,Class3):
...
ただし、多重継承は継承関係が複雑化したり名前の衝突が起き...
*クラスメソッドとスタティックメソッド
Pythonではクラスメソッドとスタティックメソッドの両方が使...
記法としては「@classmethod」と「@staticmethod」というアノ...
class StaticAndClassMethod(object):
@classmethod
def classMethod(cls):
print "class method"
@staticmethod
def staticMethod():
print "static method"
StaticAndClassMethod.classMethod()
StaticAndClassMethod.staticMethod()
結果
class method
static method
クラスメソッドとスタティックメソッドの違いは、第一引数に...
そのため、メソッドの中でクラスを使わないならスタティック...
しかし、クラス名を使えばスタティックメソッドから他のスタ...
使いどころとしては、似たような関数がたくさんある場合には...
しかし小規模開発なら関数の個数自体が少ないので、スタティ...
ページ名: