概要
このページではPythonのクラスとメソッドについて合わせて記載します。
まずは、C#とPythonでどのようにコードが変わってくるか記載します。
C#
public class Person
{
private int _no = 0;
private string _name = "";
public Person()
{
}
public int GetNo()
{
return _no;
}
public void SetNo(int no)
{
_no = no;
}
public string GetName()
{
return _name;
}
public void SetName(string name)
{
_name = name;
}
}
class Program
{
static void Main(string[] args)
{
Person person = new Person();
person.SetNo(123);
int no = person.GetNo(); // 123
person.SetName("太郎");
string name = person.GetName(); // "太郎"
}
}
Python
class Person:
def __init__(self):
self._no = 0
self._name = ''
def get_no(self):
return self._no
def set_no(self, no):
self._no = no
def get_name(self):
return self._name
def set_name(self, name):
self._name = name
# インスタンス生成
person = Person()
#メソッド呼び出し
person.set_no(123)
person.get_no() # 123
person.set_name('太郎')
person.get_name() # '太郎'
クラス宣言
クラス宣言の主なポイントを記載します。
- アクセス修飾子はつけない
- 命名規約はC#と同じ
C#
public class Person
Python
class Person:
メソッド宣言
メソッド宣言の主なポイントを記載します。
- メソッドの頭にdefを付ける
- メソッドに戻り値を書かない
- メソッドの第1引数にselfを入れる(C#で言うところのthisのようなもの。PEP8でselfという名前を付けることが推奨されている)
- メソッドの引数に変数型を書かない
- メソッド名はすべて小文字で単語の区切りは_で区切る
C#
public void SetNo(int no)
{
_no = no;
}
Python
def set_no(self, no):
self._no = no
コンストラクタ
コンストラクタの主なポイントを記載します。
- メソッド名は__init__
- 第1引数にselfを付ける
C#
public Person()
Python
def __init__(self):
インスタンス化
インスタンス化の主なポイントを記載します。
- newを書かない
C#
Person person = new Person();
Python
person = Person()
メンバ変数
メンバ変数の主なポイントを記載します。
- プライベートメンバ変数名は先頭に_を付ける ※1(プログラマがメンバ変数であるか見分ける)
- メンバ変数の宣言は、コンストラクタで行う
※ メンバ変数に_を2つつけてもOK。2つつけた場合は、self.__変数名で呼び出せなくなる。(別名に置き換えられる(マングリングされる))
C#
private int _no = 0;
private string _name = "";
public Person()
{
}
Python
def __init__(self):
self._no = 0
self._name = ''
追記
クラス変数
C#
public class SampleClass
{
public static int _staticVariable = 123;
}
class Program
{
static void Main(string[] args)
{
int value = SampleClass._staticVariable; // 123
}
}
Python
class SampleClass:
static_variable = 123
print(SampleClass.static_variable) # 123
クラス関数
クラス関数の主なポイントを記載します。
- クラス関数に@classmethodデコレータを付ける(C#でいうところのAttributeみたいなもの)
- 第1引数にclsを付ける(clsでなくてもよいが、PEP8でcls推奨)
C#
public class SampleClass
{
public static void ClassMethod()
{
Console.WriteLine("Called ClassMethod."); // "Called ClassMethod."
}
}
class Program
{
static void Main(string[] args)
{
SampleClass.ClassMethod();
}
}
Python
class SampleClass:
@classmethod
def class_method(cls):
print('called class_method.')
SampleClass.class_method() # 'called class_method.'
コメント