C++プログラマー学Python:Pythonの中のオブジェクト向け
4447 ワード
pythonにはオブジェクト向けの方法も導入されており、いくつかのC++の基本的な概念のほかに、pythonのクラスがネーミングスペースとして機能する場合があります.
pythonの継承構文はclass class_name(parent_class_name)のため、上のMyDataオブジェクトはobjectオブジェクトと継承され、objectオブジェクトについてはpythonの内蔵オブジェクトであり、ひとまず
空のクラスが宣言されていますが、C++とは異なり、このクラス自体はネーミングスペースとして使用できます.たとえば、次のようになります.
このときmathObjはネーミングスペースとしてしか使われていません
メンバー関数を定義する必要がある場合:
printFoo 2の定義は間違っています.メンバー関数printFoo 2を呼び出すと、解釈器が間違っています.彼は形参selfを定義しているので、selfはC++の中のthisですが、C++はメンバー関数を定義するときに、pythonのように手動で生成する必要はありません(それとも私は知りませんか?)メンバー関数を呼び出すとpythonとC++もクラスオブジェクトを自動的に渡すのでprintFoo 2を呼び出すと解釈器がselfオブジェクトを渡すのに役立ちますがprintFoo 2はこのパラメータを定義していません
もちろん、pythonのクラスにもコンストラクション関数とコンストラクション関数がありますが、C++とは異なり、pythonのコンストラクション関数は_init__,解析関数は_del__
objを作成すると、__が呼び出されます.init__関数は、objを他のデータに向けるとpythonがゴミ回収メカニズムを起動し、Mydataオブジェクトが削除され、同時に__が呼び出されます.del__関数#カンスウ#
pythonには、クラスを作成するときに同じ名前のインスタンスがあります.たとえば、次のようなクラスがあります.
print C.fooを入力すると、解釈器は100を出力し、C.foo=C.foo+1を入力すると、C.fooは101になります.この場合、b=C()を入力すると、print b.fooは出力が101であることを発見します.これは、fooがここで実際には静的変数であり、C++がクラス内でstatic int fooを定義しているのと同じです.
しかし、私たちのCにfunctionが定義されている場合、C.function()を呼び出すとどうなるか、エラーが表示されます.これはfooとは異なり、functionはまだクラスとバインドされていないためです.
C++でクラスの情報を取得する必要がある場合はtypeofを利用し、pythonでも同様の機能がありますが、objectからクラスを継承する必要があります.
次のようなものがあります.
__name__:クラス名
__doc__:クラスのドキュメント
__bases__:すべての親からなるメタグループ
__dict__:クラスのプロパティ
__module__:クラスが存在するモジュール
__class__:対応するクラス
1 class MyData(object):
2 pass
pythonの継承構文はclass class_name(parent_class_name)のため、上のMyDataオブジェクトはobjectオブジェクトと継承され、objectオブジェクトについてはpythonの内蔵オブジェクトであり、ひとまず
空のクラスが宣言されていますが、C++とは異なり、このクラス自体はネーミングスペースとして使用できます.たとえば、次のようになります.
1 mathObj = MyData()
2 mathObj.x = 4
3 mathObj.y = 5
4 mathObj.x + mathObj.y
このときmathObjはネーミングスペースとしてしか使われていません
メンバー関数を定義する必要がある場合:
1 class MyData(object):
2 def printFoo(self):
3 print "you invoked printFoo()"
4 def printFoo2():
5 print "you invoked printFoo2()"
printFoo 2の定義は間違っています.メンバー関数printFoo 2を呼び出すと、解釈器が間違っています.彼は形参selfを定義しているので、selfはC++の中のthisですが、C++はメンバー関数を定義するときに、pythonのように手動で生成する必要はありません(それとも私は知りませんか?)メンバー関数を呼び出すとpythonとC++もクラスオブジェクトを自動的に渡すのでprintFoo 2を呼び出すと解釈器がselfオブジェクトを渡すのに役立ちますがprintFoo 2はこのパラメータを定義していません
もちろん、pythonのクラスにもコンストラクション関数とコンストラクション関数がありますが、C++とは異なり、pythonのコンストラクション関数は_init__,解析関数は_del__
1 class MyData(object):
2 def __init__(self):
3 print "init"
4 def __del__(self):
5 print "del"
1 obj = MyData()
2 init
3 obj = 2
4 del
objを作成すると、__が呼び出されます.init__関数は、objを他のデータに向けるとpythonがゴミ回収メカニズムを起動し、Mydataオブジェクトが削除され、同時に__が呼び出されます.del__関数#カンスウ#
pythonには、クラスを作成するときに同じ名前のインスタンスがあります.たとえば、次のようなクラスがあります.
1 class C(object):
2 foo = 100
print C.fooを入力すると、解釈器は100を出力し、C.foo=C.foo+1を入力すると、C.fooは101になります.この場合、b=C()を入力すると、print b.fooは出力が101であることを発見します.これは、fooがここで実際には静的変数であり、C++がクラス内でstatic int fooを定義しているのと同じです.
しかし、私たちのCにfunctionが定義されている場合、C.function()を呼び出すとどうなるか、エラーが表示されます.これはfooとは異なり、functionはまだクラスとバインドされていないためです.
C++でクラスの情報を取得する必要がある場合はtypeofを利用し、pythonでも同様の機能がありますが、objectからクラスを継承する必要があります.
次のようなものがあります.
__name__:クラス名
__doc__:クラスのドキュメント
__bases__:すべての親からなるメタグループ
__dict__:クラスのプロパティ
__module__:クラスが存在するモジュール
__class__:対応するクラス