python3のインスタンスメソッド、クラスメソッド、スタティックメソッド

## 概要

### インスタンスメソッド
・記述方法
・試行
①インスタンスメソッドの呼び出し(初期化あり、初期化なし)
②インスタンスメソッドからインスタンス変数へのアクセス
③インスタンスメソッドからクラス変数へのアクセス
④インスタンスメソッドからクラスメソッドとスタティックメソッドにアクセス

###クラスメソッド
・記述方法
・試行
①クラスメソッドの呼び出し
②クラスメソッドからインスタンス変数へのアクセス
③クラスメソッドからクラス変数へのアクセス
④クラスメソッドからインスタンスメソッドとスタティックメソッドへのアクセス
⑤第一引数にクラスがある事による利点


###スタティックメソッド
・記述方法
・試行
⓪Boundオブジェクトを生成せずに、直接関数オブジェクトが実行されるので、クラスメソッドとインスタンスメソッドよりも、呼び出し速度が早く、メモリ消費も少ないらしい.
①スタティックメソッドの呼び出し
②スタティックメソッドからインスタンス変数へのアクセス
③スタティックメソッドからクラス変数へのアクセス
④スタティックメソッドからインスタンスメソッドとクラスメソッドへのアクセス

## インスタンスメソッド

```記述方法.py
class Example:

    def method(self):
```

###試した事

####①インスタンスメソッドの呼び出し(初期化あり、初期化なし)

```one.py
class Example:

    def __init__(self,name):
        self.name = name

    def method(self):
        print("呼び出せる")

# 初期化あり
example = Example("鎌田")
example.method() # 呼び出せる

# 初期化無し
Example.method(None)
```

####②インスタンスメソッドからインスタンス変数へのアクセス

```two.py
class Example:

    def __init__(self,name):
        self.name = name

    def method(self):
        print(self.name)

example = Example("鎌田")
example.method() # 鎌田
```

####③インスタンスメソッドからクラス変数へのアクセス

```three.py
class Example:

    age=10 #クラス変数

    def __init__(self,name):
        self.name = name

    def method(self):
        print(Example.age)

example = Example("鎌田")
example.method() # 10
```

####④インスタンスメソッドからクラスメソッドとスタティックメソッドにアクセス

```four.py
class Example:

    def __init__(self,name):
        self.name = name

    def method(self):
        self.method_class(self.name)
        self.method_static(self.name)

    @classmethod
    def method_class(cls,name):
        print(name)

    @staticmethod
    def method_static(name):
        print(name)

example = Example("鎌田")
example.method()
# 鎌田
# 鎌田
```

## クラスメソッド

```記述方法.py
class Example:

    @classmethod
    def method(cls):
```

###試した事

####①クラスメソッドの呼び出し

```one.py
class Example:

    @classmethod
    def method(cls):
        print("呼び出せる")

Example.method() #呼び出せる
```

####②クラスメソッドからインスタンス変数へのアクセス

❌

####③クラスメソッドからクラス変数へのアクセス

```three.py
class Example:

    age=10

    @classmethod
    def method(cls):
        print(cls.age)

Example.method() #10
```

####④クラスメソッドからインスタンスメソッドとスタティックメソッドへのアクセス

```four.py
class Example:

    age=10

    def method(self):
        print(self)

    @classmethod
    def method_class(cls):
        cls.method(cls.age)
        cls.method_static(cls.age)
    
    @staticmethod
    def method_static(age):
        print(age)

Example.method_class()
# 10
# 10
```

####⑤第一引数にクラスがある事による利点

サブクラスからスーパークラスのクラス変数を制御できる

```five.py
class Example:

    age=10

    @classmethod
    def method_class(cls):
        print("{0}クラスから呼ばれると{1}です.".format(cls,cls.age))

class SubExample(Example):

    age=20

Example.method_class() # <class '__main__.Example'>クラスから呼ばれると10です.
SubExample.method_class() # <class '__main__.SubExample'>クラスから呼ばれると20です.
```

## スタティックメソッド

```記述方法.py
class Example:

    @staticmethod
    def method():
```

###試した事

####⓪Boundオブジェクトを生成せずに、直接関数オブジェクトが実行されるので、クラスメソッドとインスタンスメソッドよりも、呼び出し速度が早く、メモリ消費も少ないらしい.

####①スタティックメソッドの呼び出し

```one.py
class Example:

    @staticmethod
    def method():
        print("呼び出せる")

Example.method() #呼び出せる
```

####②スタティックメソッドからインスタンス変数へのアクセス
❌

####③スタティックメソッドからクラス変数へのアクセス

```three.py
class Example:

    age=10

    @staticmethod
    def method():
        print(Example.age)

Example.method() #10
```

####④スタティックメソッドからインスタンスメソッドとクラスメソッドへのアクセス

```four.py
class Example:

    age=10

    def method(self):
        print("hello")

    @classmethod
    def method_class(cls):
        print("hello")
    
    @staticmethod
    def method_static():
        Example.method(None)
        Example.method_class()

Example.method_static()
```