class MyClass: def my_method(self):
尚、第一引数の名前は別にselfでなくてもよい。ただ慣習的にselfが使われる。
class MyClass: def my_method(self): return 1 m = MyClass() m.my_method() => 1
ちなみにメソッドコールの時はselfは不要。暗黙的に現在のオブジェクトが渡される。
よいけど、慣習的に大文字にしてるのだとか
class my_class: def my_method(self): return 1 m = my_class() m.my_method() => 1
ちなみにモジュール名も小文字でよい。よいどころか小文字が一般的のようだ。
a = 10 def r(): return a def w(): a = 1 return a r() => 10 w() => 1 a => 10
class MyClass: i = 0 def my_method(self): return i
先の「4 関数の中から関数外の変数へのアクセスはリードオンリー」の例は関数の例であるためレシーバ無しでも上手くいくがメソッドの場合はレシーバが必要。
class MyClass: pass m = MyClass() m.my_variable = 1 m.my_variable => 1
これはRubyのinspectメソッドのようにオブジェクトの内部を人間にわかりやすく表示するためのもの。
class MyClass: def __str__(self): return 'foo' m = MyClass() print(m) => foo
Rubyのpメソッドがオブジェクトのinspectメソッドを利用するようにPythonではprint()関数がオブジェクトの__str__()メソッドを利用する。
つまり、それが慣習であって、厳格に非公開にすることはできない。
class MyClass: public_variable = "public variable" def public_method(self): return "public method" _private_variable = "private variable" def _private_method(self): return "private method" m = MyClass() m.public_variable => 'public variable' m.public_method() => 'public method' m._private_variable => 'private variable' m._private_method() => 'private method'
尚、頭にアンダースコアを2つ続けると、慣習ではなく本当にその変数やメソッドにアクセスできなくなるが、これも完全に非公開になったわけではなく、ある法則によって別名に変換され、元々の名前ではアクセスできなくなっただけ。
class MyClass: def __private_method(self): pass m = MyClass() m.__private_method() Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: 'MyClass' object has no attribute '__my_func'
Rubyでいうprotectedは言及されていないのでPythonには無いのかも知れない。
ただし、Pythonでは変数名の全ての文字を大文字にする。それが慣習。つまりプログラマが定数として扱うだけであって本質的には通常の変数となんら変わりない。
CONSTANT = 'constant variable' CONSTANT => 'constant variable' CONSTANT = 'foo' CONSTANT => 'foo'
a = 0
a++
File "<stdin>", line 1
a++
^
SyntaxError: invalid syntax