事務屋さんの備忘録

主にプログラミングのことを書いていきます。メモというか備忘録的な感じで。プログラミングといっても、私はプロのエンジニアでも本職のプログラマーでもありません。単なる事務職をやってるサラリーマンで、空いた時間にちょこちょこっとプログラミングしてる程度です。よってこのブログに記載したことが誤っていたり、もっとよい方法がある場合もあると思います。その場合には、ご指摘いただけると嬉しいです。また、このブログを読んで役に立った、なんて方がいらっしゃったら幸いですね。

Python 基礎 クラス

メモ。クラスいろいろ。

class Car:
    
    #クラス変数
    maker="PEACE" #自動車メーカー 
    count=0 #台数 
    
    #初期化メソッド
    def __init__(self,color="white"):
        self.color=color #引数で受け取った値を代入
        self.mileage=0 #0からスタート
        
    #インスタンスメソッド
    def drive(self,km):
        self.mileage += km
        msg=f"{km}kmドライブしました。総距離は{self.mileage}kmです。"
        print(msg)
        
car1=Car()
car1.drive(15) #15kmドライブしました。総距離は15kmです。
car1.drive(20) #20kmドライブしました。総距離は35kmです。

car2=Car()
car2.drive(10) #10kmドライブしました。総距離は10kmです。

car1.drive(10) #10kmドライブしました。総距離は45kmです。


print("----------")


class Spam:
    val=100
    def ham(self):
        self.egg("call method")    
        
    def egg(self,msg):
        print(msg)
        print(self.val)
        
spam=Spam()
spam.ham()  #call method  100


print("----------")


#継承
class Base:
    def method_base(self):
        print("Base")

class Derived(Base):
    def method_derived(self):
        print ("Derived")
        self.method_base() #親のメソッドを実装できる

derived = Derived() #インスタンス生成
derived.method_base() #Base  親のメソッドを実行できる
derived.method_derived() #Derived Base  差分のメソッドのみ実装している


print("----------")


#オーバーライド
class Base2:
    def method_base(self):
        print("Base")

class Derived2(Base2):
    def method_derived(self):
        print ("Derived")
    def method_base(self):
        print("Override")

derived2 = Derived2() #インスタンス生成
derived2.method_base() #Base  オーバーライド


print("----------")


#スーパークラスの初期化メソッドに引数を渡す
#スーパークラス
class Person:
    def __init__(self,name,age):
        self.name=name
        self.age=age
        
person=Person("Nakamura",23)
print(person.name) #Nakamura
print(person.age) #23

#サブクラス
class Player(Person):
    def __init__(self,number,position): #Personクラスの初期化メソッドをオーバーライドしてしまう
        self.number=number
        self.position=position
        
player=Player(10,"MF")
#print(player.name) #err
#print(player.age) #err
print(player.number) #10
print(player.position) #MF

print("----------")

#サブクラス
class NewPlayer(Person):
    def __init__(self,name,age,number,position):
        super().__init__(name,age) #スーパークラスの初期化メソッドを呼び出す
        self.number=number
        self.position=position
        
newplayer=NewPlayer("Honda",30,5,"FW")
print(newplayer.name) #Honda 
print(newplayer.age) #30
print(newplayer.number) #5
print(newplayer.position) #FW


print("----------")
   

#プロパティ
class Person2:
    def __init__(self,name):
        self.__name=name #非公開のインスタンス変数
        
    def who(self):
        print(self.__name + "です。") #クラス内では利用可能
        
man=Person2("Kagawa")
print(man.who())
#print(man.__name) #err 直接アクセスするとエラー

print("----------")

#ゲッター、セッター
class Goods:
    #初期化メソッド
    def __init__(self,name,price):
        #非公開のインスタンス変数(辞書)
        self.__data={"name":name, "price":price}
        
    #nameプロパティ(ゲッター)
    @property
    def name(self):
        return self.__data["name"]
    
    #nameプロパティ(セッター)
    @name.setter
    def name(self,value):
        self.__data["name"]=value #__data辞書のnameキーに値を設定する
        
    
    #priceプロパティ(ゲッター)  priceにはセッター関数がないのでリードオンリー
    @property
    def price(self):
        price=self.__data["price"] #__data辞書のpriceキーの値を取り出す
        price_str=f"{price:,}円"
        return price_str
    
shoes=Goods("Dream",5400)
print(shoes.name) #Dream
shoes.name="New Dream" #更新可能
print(shoes.name) #New Dream
        
print(shoes.price) #5,400円
#shoes.price=7200 #err 更新しようとするとエラーになります リードオンリーなので