Python備忘録4(クラス)

# クラス
## クラス1
```python:class-cat.py
class Cat:
    # ドキュメンテーション文字列
    """猫クラス"""

    # クラス変数
    animalType = 'cat'

    # コンストラクタ
    def __init__(self, name, fur, bornYear):
        # インスタンス変数
        self.name = name    
        self.bornYear = bornYear      
        self.fur = fur      


    # インスタンスメソッド(第一引数:self)
    def callName(self):
        print(f'{self.name}を呼びました')
        print(f'{self.name}は来ました')

    def feedFood(self,food):
        print(f'{food}を出しました')
        print(f'{self.name}は小走りに来ました')
        print(f'{self.name}は{food}を食べました')


    # クラスメソッド(第一引数:cls)
    @classmethod
    def getType(cls):
        return cls.animalType


    # スタティックメソッド(第一引数の指定なし)
    @staticmethod
    def printAnimal():
        return 'Animal'


# スタティックメソッドはインスタンス化する前にアクセスできる
print(Cat.printAnimal())

# クラスメソッドはインスタンス化する前にアクセスできる
# クラス変数にアクセスできる
print(Cat.getType())

# クラス変数はインスタンス化する前にアクセスできる
print(Cat.animalType)

print('-----インスタンス化実行-----')

# インスタンスする際に、コンストラクタに引数を渡す
myCat = Cat('たま','white',2020)

# インスタンス後に、インスタンスメソッドにアクセスできる
myCat.callName()
myCat.feedFood('ちゅーる')
```

```console:console
Animal
cat
cat
-----インスタンス化実行-----
たまを呼びました
たまは来ました
ちゅーるを出しました
たまは小走りに来ました
たまはちゅーるを食べました
```


## クラス2(ポリモーフィズム・多態性)
```python:class-polymorphism.py
# ポリモーフィズム(多態性)
from abc import abstractclassmethod, ABCMeta

class Animal(metaclass=ABCMeta):
    def __init__(self, name):
        self.name = name

    @abstractclassmethod
    def callName(self):
        pass

class Cat(Animal):
    def callName(self):
        print(f'{self.name}はしっぽを立てながら来ました')

class Dog(Animal):
    def callName(self):
        print(f'{self.name}はしっぽを振りながら来ました')


cat1 = Cat('たま')
dog1 = Dog('ぽち')

cat1.callName()
dog1.callName()
```
```console:console
たまはしっぽを立てながら来ました
ぽちはしっぽを振りながら来ました
```
- 同じメソッド名でも違う動作を定義することができる



## クラス3(getter,setter)
### getter,setter1
```python:class-getterSetter1.py
class Cat:
    # クラス変数(プライベート)
    __animalType = 'Cat'

    # コンストラクタ
    def __init__(self, name, fur, bornYear):
        # インスタンス変数(プライベート)
        self.__name = name    
        self.__bornYear = bornYear      
        self.__fur = fur      

    def getName(self):
        return self.__name

    def getBornYear(self):
        return self.__bornYear

    def getFur(self):
        return self.__fur


    def setName(self,name):
        self.__name = name

    def setBornYear(self,bornYear):
        if not(0<=bornYear<=30):
            print('年齢の設定が間違っています')
            return
        else:  
            self.__bornYear = bornYear

    def setFur(self,fur):
        self.__fur = fur


    # getter/setterの定義
    name = property(getName,setName) 
    bornYear = property(getBornYear,setBornYear) 
    fur = property(getFur,setFur) 



myCat = Cat('たま','white',2020)

print(myCat.name)
myCat.name = 'みー'
print(myCat.name)

myCat.bornYear = -1

# プライベート変数も[_classname__variablename]でアクセス可能
print(myCat._Cat__name)

```


```console:console
たま
みー
年齢の設定が間違っています
みー
```



### getter,setter2
```python:class-getterSetter2.py
class Cat:
    # クラス変数(プライベート)
    __animalType = 'Cat'

    # コンストラクタ
    def __init__(self, name, fur, bornYear):
        # インスタンス変数(プライベート)
        self.__name = name    
        self.__bornYear = bornYear      
        self.__fur = fur      


    @property
    def name(self):
        return self.__name

    @property
    def bornYear(self):
        return self.__bornYear

    @property
    def fur(self):
        return self.__fur


    @name.setter
    def name(self,name):
        self.__name = name

    @bornYear.setter
    def bornYear(self,bornYear):
        if not(0<=bornYear<=30):
            print('年齢の設定が間違っています')
            return
        else:  
            self.__bornYear = bornYear

    @fur.setter
    def fur(self,fur):
        self.__fur = fur
        self.__fur = fur


myCat = Cat('たま','white',2020)

print(myCat.name)
myCat.name = 'みー'
print(myCat.name)

myCat.bornYear = -1

# プライベート変数も[_classname__variablename]でアクセス可能
print(myCat._Cat__name)
```
```console:console
たま
みー
年齢の設定が間違っています
みー
```