【Python】クラスとメソッドについてC#と比較して理解する

python Python

概要

このページでは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.'

コメント