ð Pythonã®「ç¶æ¿」ããã¹ã¿ãŒ!ã³ãŒããåå©çšã、ã¹ããŒãã«éçºããæ¥µæã培åºè§£èª¬
「ãŸãåããããªã³ãŒããæžããŠãã…」 「ãã®æ©èœ、ã¡ãã£ãšã ãå€ãããã ããªã®ã«、å šéšæžãçŽãã®ã¯é¢åã 㪅」
ããããªãããããªæ©ã¿ãæ±ããŠãããªã、Pythonã®「ç¶æ¿」ããã®æäžäž»ãšãªãã§ããã。
ããã°ã©ãã³ã°ã®äžçã«ã¯、「ãªããžã§ã¯ãæåããã°ã©ãã³ã° (OOP)」ãšããèãæ¹ããããŸã。ãã®äžã§ã「ç¶æ¿」ã¯、ã³ãŒãã®åå©çšæ§ãé«ã、ä¿å®æ§ãåäžãã、å°æ¥ã®æ©èœæ¡åŒµã容æã«ããããã®éåžžã«åŒ·åãªæŠå¿µã§ã。
ããã、「ç¶æ¿」ãšèããš、ãªãã ãé£ããã、è€éã«ãªããã…ãšæããæ¹ããããããããŸããã。å®å¿ããŠãã ãã。ãã®èšäºã§ã¯、Pythonã®「ç¶æ¿」ã«ã€ããŠ、
- åºæ¬ã®「ã」ãã
- å®è·µçãªäœ¿ãæ¹
- ç¥ã£ãŠãããšåŸããå¿çšãã¯ããã¯
- ãããŠ、ãã€「ç¶æ¿」ã䜿ãã¹ãã、ãããã¯é¿ããã¹ãã
ãŸã§、åå¿è ã®æ¹ã«ãåãããããããã«、å ·äœçãªäŸã亀ããªãã培åºçã«è§£èª¬ããŠãããŸã。ãã®èšäºãèªã¿çµããé ã«ã¯、ããªãã¯Pythonã®「ç¶æ¿」ãèªä¿¡ãæã£ãŠäœ¿ãããªã、ããå¹ççã§ã¹ããŒããªã³ãŒããæžããããã«ãªã£ãŠããã¯ãã§ã。
ãã、Pythonéçºã®æ¬¡ã®ã¬ãã«ãžé²ãããã®æãéããŸããã!
ð ãããã「ã¯ã©ã¹」ã£ãŠãªãã ã£ã?(è¶ ãããã)
「ç¶æ¿」ã®è©±ã«å ¥ãåã«、ãã®åå°ãšãªã「ã¯ã©ã¹」ã«ã€ããŠç°¡åã«ããããããŠãããŸããã。
Pythonã«ããã「ã¯ã©ã¹」ãšã¯、äžèšã§èšãã°「èšèšå³」ã®ãããªãã®ã§ã。ãã®èšèšå³ãã、å ·äœçãª「ã¢ã」(ããã「ãªããžã§ã¯ã」ãŸãã¯「ã€ã³ã¹ã¿ã³ã¹」ãšåŒã³ãŸã)ãäœãåºããŸã。
äŸãã°、Car(è»)ãšããã¯ã©ã¹ããã£ããšããŸã。
- 屿§(ããŒã¿): è»ã®è²、ã¡ãŒã«ãŒ、æé«é床ãªã©、ãã®è»ãæã€「æ å ±」
- ã¡ãœãã(æ¯ãèã): è»ãèµ°ã、æ¢ãŸã、ã¯ã©ã¯ã·ã§ã³ã鳎ãããªã©、ãã®è»ã「ã§ããããš」
class Car:
def __init__(self, make, model, color):
self.make = make # ã¡ãŒã«ãŒ
self.model = model # ã¢ãã«
self.color = color # è²
self.speed = 0
def start_engine(self):
print(f"{self.make}ã®ãšã³ãžã³ãããããŸãã。")
def accelerate(self, amount):
self.speed += amount
print(f"çŸåšæé{self.speed}kmã§èµ°è¡äž。")
def brake(self):
self.speed = 0
print("忢ããŸãã。")
# Carã¯ã©ã¹(èšèšå³)ãã、å
·äœçãªè»(ã€ã³ã¹ã¿ã³ã¹)ãäœã
my_car = Car("ããšã¿", "ããªãŠã¹", "çœ")
your_car = Car("ãã³ã", "ãã£ãã", "é")
# ã€ã³ã¹ã¿ã³ã¹ã®å±æ§ã«ã¢ã¯ã»ã¹ããã、ã¡ãœãããåŒã³åºãããã§ãã
print(f"ç§ã®è»ã¯{my_car.make}ã®{my_car.model}ã§、è²ã¯{my_car.color}ã§ã。")
my_car.start_engine()
my_car.accelerate(50)
my_car.brake()
print(f"ããªãã®è»ã¯{your_car.make}ã®{your_car.model}ã§、è²ã¯{your_car.color}ã§ã。")
ãã®ããã«、ã¯ã©ã¹ã䜿ãããšã§、é¢é£ããããŒã¿(屿§)ãšæ©èœ(ã¡ãœãã)ãã²ãšãŸãšãã«ã、ããã°ã©ã ãããæŽçãããã、çè§£ãããããã®ã«ããããšãã§ããŸã。ããããªããžã§ã¯ãæåããã°ã©ãã³ã°ã®åºæ¬ã§ã。
𧬠Python「ç¶æ¿」ã®åºæ¬ã®「ã」:芪åé¢ä¿ã§ã³ãŒããå ±æ
ããããæ¬é¡ã®「ç¶æ¿」ã«å ¥ã£ãŠãããŸããã。
ç¶æ¿ãšã¯äœã?:芪ããåãžåãç¶ãããDNA
「ç¶æ¿」ãšã¯、ããã¯ã©ã¹ãå¥ã®ã¯ã©ã¹ã®å±æ§ãã¡ãœãããåŒãç¶ã、åå©çšããä»çµã¿ã®ããšã§ã。ãŸãã§、èŠªã®æã€ç¹åŸŽãåã«åãç¶ãããããã«、芪ãšãªãã¯ã©ã¹(ã¹ãŒããŒã¯ã©ã¹ãŸãã¯èŠªã¯ã©ã¹)ã®æ©èœãããŒã¿ã、åãšãªãã¯ã©ã¹(ãµãã¯ã©ã¹ãŸãã¯åã¯ã©ã¹)ããã®ãŸãŸå©çšã§ããã®ã§ã。
ãªããã®ãããªä»çµã¿ãå¿ èŠãªã®ã§ãããã?
äŸãã°、åç©ã衚çŸããããã°ã©ã ãèããŠã¿ãŸããã。
Animal(åç©)ã¯ã©ã¹ã«ã¯、「åå」「鳎ã」ãšãã£ãå ±éã®å±æ§ãã¡ãœããããããŸã。Dog(ç¬)ã¯ã©ã¹ãCat(ç«)ã¯ã©ã¹ã、Animalã®äžçš®ã§ã。ãããã「åå」ãæã¡、「鳎ã」ãšããè¡çºãããŸã。
ããç¶æ¿ããªããã°、Dogã¯ã©ã¹ãšCatã¯ã©ã¹ã®äž¡æ¹ã«、Animalã¯ã©ã¹ãšåã「åå」屿§ã「鳎ã」ã¡ãœãããããããæžããªããã°ãªããŸãã。ããã¯ã³ãŒãã®éè€ãçã¿、倿Žããã£ãå Žåã«è€æ°ã®ç®æãä¿®æ£ããå¿
èŠãåºãŠããŸã。
ç¶æ¿ã䜿ãã°、Animalã¯ã©ã¹ã«å
±éã®æ©èœãäžåºŠæžããŠããŸãã°、Dogã¯ã©ã¹ãCatã¯ã©ã¹ã¯ãããèªåçã«åŒãç¶ãã§å©çšã§ããã®ã§ã。
ã·ã³ãã«ãªç¶æ¿ã®ã³ãŒããèŠãŠã¿ãã
Pythonã§ç¶æ¿ãå®çŸ©ããã®ã¯ãšãŠãç°¡åã§ã。åã¯ã©ã¹ãå®çŸ©ããéã«、äžžæ¬åŒ§ () ã®äžã«èŠªã¯ã©ã¹ã®ååãæå®ããã ãã§ã。
# ã¹ãŒããŒã¯ã©ã¹(芪ã¯ã©ã¹)ã®å®çŸ©
class Animal:
def __init__(self, name):
self.name = name
def speak(self):
print(f"{self.name}ãäœãã話ããŠããŸã。")
# ãµãã¯ã©ã¹(åã¯ã©ã¹)ã®å®çŸ©
# Animalã¯ã©ã¹ãç¶æ¿ããŠããããšã () ã§ç€ºã
class Dog(Animal):
def bark(self):
print(f"{self.name}ã¯ã¯ã³ã¯ã³ãšå ããŸã!")
# Dogã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ãäœæ
my_dog = Dog("ãã")
# åã¯ã©ã¹(Dog)ã¯èŠªã¯ã©ã¹(Animal)ã®å±æ§ãšã¡ãœãããåŒãç¶ãã§ãã
print(f"ç§ã®ç¬ã®ååã¯{my_dog.name}ã§ã。") # Animalã®name屿§ãå©çš
my_dog.speak() # Animalã®speakã¡ãœãããå©çš
# åã¯ã©ã¹(Dog)ç¬èªã®ã¡ãœãããæã£ãŠãã
my_dog.bark()
äžèšã®ã³ãŒãã§ã¯、Dogã¯ã©ã¹ã¯Animalã¯ã©ã¹ãç¶æ¿ããŠããŸã。
ããã«ãã、Dogã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ã§ããmy_dogã¯、Animalã¯ã©ã¹ã§å®çŸ©ãããname屿§ãšspeak()ã¡ãœããã、äœãããªããŠãå©çšã§ããããã«ãªããŸã。ããã«、Dogã¯ã©ã¹ç¬èªã®bark()ã¡ãœãããæã£ãŠããŸãã。
ãã®ããã«、ç¶æ¿ã䜿ãããšã§、å ±éã®æ©èœã芪ã¯ã©ã¹ã«éçŽã、åã¯ã©ã¹ã¯ãã®æ©èœãå©çšãã€ã€、ç¬èªã®æ©èœã远å ã§ããããã«ãªããŸã。
✨ ç¶æ¿ãããã«æŽ»çš!å®è·µçãªãã¯ããã¯
åºæ¬ãåãã£ããšããã§、ç¶æ¿ããããã¯ãã«ã«äœ¿ãããªãããã®å®è·µçãªãã¯ããã¯ãèŠãŠãããŸããã。
åã¯ã©ã¹ã§ã¡ãœããã「äžæžã (ãªãŒããŒã©ã€ã)」ãã
芪ã¯ã©ã¹ããç¶æ¿ããã¡ãœããã®äžéšã®åäœã ãã倿Žãããå ŽåããããŸã。äŸãã°、Animalã¯ã©ã¹ã®speak()ã¡ãœããã¯äžè¬çãªé³Žã声ã衚çŸããŸãã、Dogã¯ã©ã¹ã§ã¯「ã¯ã³ã¯ã³」、Catã¯ã©ã¹ã§ã¯「ãã£ãŒ」ãš、å
·äœçãªé³Žã声ã«å€ãããã§ããã。
ãã®ãããªå Žåã«äœ¿ãã®ã「ã¡ãœããã®ãªãŒããŒã©ã€ã(äžæžã)」ã§ã。åã¯ã©ã¹ã§èŠªã¯ã©ã¹ãšåãååã®ã¡ãœãããå®çŸ©ãããš、芪ã¯ã©ã¹ã®ã¡ãœããã§ã¯ãªãåã¯ã©ã¹ã§å®çŸ©ããã¡ãœãããåŒã³åºãããããã«ãªããŸã。
class Animal:
def __init__(self, name):
self.name = name
def speak(self):
print(f"{self.name}ãäœãã話ããŠããŸã。")
class Dog(Animal):
# 芪ã¯ã©ã¹ã®speakã¡ãœããããªãŒããŒã©ã€ã
def speak(self):
print(f"{self.name}ã¯ã¯ã³ã¯ã³ãšå ããŸã!")
class Cat(Animal):
# 芪ã¯ã©ã¹ã®speakã¡ãœããããªãŒããŒã©ã€ã
def speak(self):
print(f"{self.name}ã¯ãã£ãŒãšé³ŽããŸã。")
# ã€ã³ã¹ã¿ã³ã¹ã®äœæ
generic_animal = Animal("åç¡ã")
my_dog = Dog("ãã")
my_cat = Cat("ããŸ")
generic_animal.speak() # åºå: åç¡ããäœãã話ããŠããŸã。
my_dog.speak() # åºå: ããã¯ã¯ã³ã¯ã³ãšå ããŸã!
my_cat.speak() # åºå: ããŸã¯ãã£ãŒãšé³ŽããŸã。
ãã®ããã«、åãspeak()ã¡ãœãããåŒã³åºããŠã、ã€ã³ã¹ã¿ã³ã¹ã®å(DogãCatã)ã«ãã£ãŠç°ãªãæ¯ãèããããŸã。ããããªããžã§ã¯ãæåã®åŒ·åãªç¹åŸŽã®äžã€ã§ã。
èŠªã®æ©èœãåŒã³åºã「super()」ã®éæ³
ã¡ãœããããªãŒããŒã©ã€ãããé、「èŠªã®æ©èœã¯ãã®ãŸãŸå©çšãã€ã€、åã¯ã©ã¹ã§å°ãã ã远å ã®åŠçãããã」ãšããã±ãŒã¹ããããŸã。äŸãã°、Dogã®speak()ã¡ãœããã§、ãŸãAnimalã®speak()ãåŒã³åºããŠå
±éã®æšæ¶ãã、ãã®åŸã«Dogç¬èªã®「ã¯ã³ã¯ã³!」ãä»ãå ããã、ãšãã£ãå Žåã§ã。
ãã®ãããªãšãã«äŸ¿å©ãªã®ãçµã¿èŸŒã¿é¢æ°super()ã§ã。super()ã䜿ããš、芪ã¯ã©ã¹ã®ã¡ãœãããæç€ºçã«åŒã³åºãããšãã§ããŸã。
ç¹ã«éèŠãªã®ã、ã¯ã©ã¹ãã€ã³ã¹ã¿ã³ã¹åãããéã«åŒã³åºãããç¹æ®ãªã¡ãœãã__init__ã§ã®super().__init__()ã®äœ¿çšã§ã。
class Animal:
def __init__(self, name):
self.name = name
print(f"Animalã¯ã©ã¹ã®__init__ãåŒã°ããŸãã: {self.name}")
def speak(self):
print(f"{self.name}ãäœãã話ããŠããŸã。")
class Dog(Animal):
def __init__(self, name, breed):
# 芪ã¯ã©ã¹ã®__init__ãåŒã³åºãããšã§、name屿§ãåæåããã
super().__init__(name)
self.breed = breed # Dogã¯ã©ã¹ç¬èªã®å±æ§
print(f"Dogã¯ã©ã¹ã®__init__ãåŒã°ããŸãã: {self.name}, {self.breed}")
def speak(self):
# 芪ã¯ã©ã¹ã®speakã¡ãœãããåŒã³åºã
super().speak()
print(f"{self.name}({self.breed})ã¯、ããã«「ã¯ã³ã¯ã³!」ãšå ããŸã。")
my_dog = Dog("ã·ã", "æŽç¬")
print(f"åå: {my_dog.name}, çš®é¡: {my_dog.breed}")
my_dog.speak()
ãã®äŸã§ã¯、Dogã¯ã©ã¹ã®__init__ã¡ãœããã§super().__init__(name)ãåŒã³åºãããšã§、Animalã¯ã©ã¹ã®name屿§ã®åæååŠçãåã¯ã©ã¹ã§æ¹ããŠæžãããšãªãå©çšããŠããŸã。ããã«ãã、ã³ãŒãã®éè€ãé²ã、倿Žã«åŒ·ãèšèšã«ãªããŸã。
speak()ã¡ãœããã§ãåæ§ã«、super().speak()ã§èŠªã®ã¡ãã»ãŒãžãåºåããåŸ、Dogç¬èªã®ã¡ãã»ãŒãžã远å ããŠããŸã。
super()ã¯、ç¶æ¿ãæ±ãäžã§éåžžã«éèŠãªããŒã¯ãŒãã§ãã®ã§、ãã£ãããšãã®äœ¿ãæ¹ããã¹ã¿ãŒããŸããã。
屿§ã®è¿œå ãšåæå
åã¯ã©ã¹ã¯、芪ã¯ã©ã¹ã®å±æ§ãã¡ãœãããç¶æ¿ããã ãã§ãªã、ç¬èªã®å±æ§ãã¡ãœããã远å ããããšãã§ããŸã。ããã¯、芪ã¯ã©ã¹ã®æ±çšçãªæ©èœãããŒã¹ã«ãã€ã€、åã¯ã©ã¹ç¹æã®èŠçŽ ãå ããŠããéã«åœ¹ç«ã¡ãŸã。
å
ã»ã©ã®Dogã¯ã©ã¹ã®äŸã§ãèŠãããã«、breed(ç¬çš®)ãšãã屿§ã¯Animalã«ã¯ãªãDogç¬èªã®å±æ§ã§ã。ããã__init__ã¡ãœããå
ã§åæåããããšã§、åã¯ã©ã¹ç¬èªã®ããŒã¿ãæãããããšãã§ããŸã。
class Vehicle:
def __init__(self, brand, model):
self.brand = brand
self.model = model
self.is_running = False
def start(self):
self.is_running = True
print(f"{self.brand} {self.model}ãå§åããŸãã。")
def stop(self):
self.is_running = False
print(f"{self.brand} {self.model}ã忢ããŸãã。")
class Car(Vehicle):
def __init__(self, brand, model, num_wheels):
super().__init__(brand, model) # 芪ã¯ã©ã¹ã®åæåã¡ãœãããåŒã³åºã
self.num_wheels = num_wheels # Carã¯ã©ã¹ç¬èªã®å±æ§ã远å
def drive(self):
if self.is_running:
print(f"{self.brand} {self.model}ã¯{self.num_wheels}茪ã§èµ°è¡äžã§ã。")
else:
print(f"{self.brand} {self.model}ã¯åæ¢ããŠããŸã。ãŸãå§åããŠãã ãã。")
my_car = Car("æ¥ç£", "ã¹ã«ã€ã©ã€ã³", 4)
my_car.start()
my_car.drive()
my_car.stop()
my_car.drive()
ãã®äŸã§ã¯、Carã¯ã©ã¹ãVehicleã¯ã©ã¹ã®brandãmodel、start(), stop()ãç¶æ¿ãã€ã€、num_wheelsãšããç¬èªã®å±æ§ãšdrive()ãšããç¬èªã®ã¡ãœããã远å ããŠããŸã。__init__å
ã§super().__init__ãåŒã³åºãããšã§、芪ã®åæååŠçãé©åã«è¡ã、ãã®åŸã«åã¯ã©ã¹ç¬èªã®åæåãè¡ã£ãŠããç¹ã«æ³šç®ããŠãã ãã。
ð️ ç¶æ¿ã®å¿çš:ããã«ãã¯ãã«ãªèšèšãž
ããããã¯、ããé«åºŠãªç¶æ¿ã®æŠå¿µãšãã¯ããã¯ãæãäžããŠãããŸã。
å€éç¶æ¿:è€æ°ã®èŠªããåãç¶ã
Pythonã¯、è€æ°ã®ã¯ã©ã¹ããåæã«ç¶æ¿ãã「å€éç¶æ¿」ããµããŒãããŠããŸã。ã€ãŸã、åã¯ã©ã¹ãè€æ°ã®èŠªã¯ã©ã¹ã®å±æ§ãã¡ãœãããäžåºŠã«åŒãç¶ãããšãã§ããã®ã§ã。
äŸãã°、Flyable(空ãé£ã¹ã)ãšããèœåã衚ãã¯ã©ã¹ãš、Dog(ç¬)ã¯ã©ã¹ãäž¡æ¹ç¶æ¿ããŠ、FlyingDog(空é£ã¶ç¬)ãšããã¯ã©ã¹ãäœã、ãšãã£ãããšãå¯èœã§ã。
class LandAnimal:
def walk(self):
print("å°é¢ãæ©ããŠããŸã。")
class WaterAnimal:
def swim(self):
print("æ°Žãæ³³ãã§ããŸã。")
class Duck(LandAnimal, WaterAnimal): # è€æ°ã®èŠªã¯ã©ã¹ãæå®
def quack(self):
print("ã¬ãŒã¬ãŒãšé³ŽããŸã。")
my_duck = Duck()
my_duck.quack()
my_duck.walk()
my_duck.swim()
äžèŠãããšéåžžã«åŒ·åãªæ©èœã«èŠããŸãã、å€éç¶æ¿ã«ã¯æ³šæãå¿ èŠã§ã。
- ã¡ãªãã: è€æ°ã®ç°ãªãæ©èœãçµã¿åãããã¯ã©ã¹ãæè»ã«äœæã§ãã。
- ãã¡ãªãã:
- è€éæ§ã®å¢å€§: ã©ã®èŠªã¯ã©ã¹ããã©ã®ã¡ãœãããç¶æ¿ãããã®ã、ã³ãŒããèªã¿ã«ãããªã。
- ãã€ã€ã¢ã³ãåé¡: è€æ°ã®èŠªã¯ã©ã¹ãããã«å ±éã®èŠªã¯ã©ã¹ãæã£ãŠããå Žå(ã²ã圢ã®ãããªç¶æ¿å³)、ã©ã®ã¡ãœãããåŒã³åºãã¹ããææ§ã«ãªãåé¡。
Pythonã§ã¯、ãã®ãã€ã€ã¢ã³ãåé¡ã«å¯Ÿå¿ãããã、MRO (Method Resolution Order) ãšããä»çµã¿ãå°å
¥ãããŠããŸã。ããã¯、ã¡ãœãããæ¢çŽ¢ããé åºã決å®ããã«ãŒã«ã§、ClassName.__mro__ãšããç¹æ®å±æ§ã§ç¢ºèªã§ããŸãã、éåžžã¯æ·±ãæèããå¿
èŠã¯ãããŸãã。
å€éç¶æ¿ã¯åŒ·åã§ããåé¢、ã³ãŒããè€éã«ãªããã¡ãªã®ã§、æ¬åœã«å¿ èŠãªå Žåã«ã®ã¿æ éã«å©çšããã®ããã¹ããã©ã¯ãã£ã¹ã§ã。å€ãã®å Žå、åŸè¿°ãã「ã³ã³ããžã·ã§ã³」ãšããå¥ã®ææ³ã§ä»£æ¿ã§ããããšãå€ãã§ã。
æœè±¡ã¯ã©ã¹ãšæœè±¡ã¡ãœãã (çºå±)
「ãã®ã¯ã©ã¹ãç¶æ¿ããåã¯ã©ã¹ã¯、å¿ ããã®ã¡ãœãããå®è£ ããªããã°ãªããªã」ãšããã«ãŒã«ãèšãããå ŽåããããŸã。ãã®ãããªèŠä»¶ã匷å¶ããããã«äœ¿ãã®ã「æœè±¡ã¯ã©ã¹ (Abstract Base Class)」ãš「æœè±¡ã¡ãœãã (Abstract Method)」ã§ã。
Pythonã§ã¯、abcã¢ãžã¥ãŒã«ã䜿ãããšã§æœè±¡ã¯ã©ã¹ãå®çŸ©ã§ããŸã。
from abc import ABC, abstractmethod
# æœè±¡ã¯ã©ã¹ã®å®çŸ©: ABCãç¶æ¿ãã
class Shape(ABC):
def __init__(self, name):
self.name = name
# æœè±¡ã¡ãœããã®å®çŸ©: @abstractmethodãã³ã¬ãŒã¿ãä»ãã
@abstractmethod
def area(self):
# æœè±¡ã¡ãœããã¯å
·äœçãªå®è£
ãæããªã(passã§OK)
pass
@abstractmethod
def perimeter(self):
pass
def get_info(self):
return f"å³åœ¢: {self.name}"
# Shapeãç¶æ¿ããConcreteã¯ã©ã¹
class Circle(Shape):
def __init__(self, name, radius):
super().__init__(name)
self.radius = radius
def area(self): # æœè±¡ã¡ãœããareaãå¿
ãå®è£
ããå¿
èŠããã
return 3.14 * self.radius * self.radius
def perimeter(self): # æœè±¡ã¡ãœããperimeterãå¿
ãå®è£
ããå¿
èŠããã
return 2 * 3.14 * self.radius
class Rectangle(Shape):
def __init__(self, name, width, height):
super().__init__(name)
self.width = width
self.height = height
def area(self): # æœè±¡ã¡ãœããareaãå¿
ãå®è£
ããå¿
èŠããã
return self.width * self.height
def perimeter(self): # æœè±¡ã¡ãœããperimeterãå¿
ãå®è£
ããå¿
èŠããã
return 2 * (self.width + self.height)
# æœè±¡ã¯ã©ã¹ã¯çŽæ¥ã€ã³ã¹ã¿ã³ã¹åã§ããªã
# try:
# s = Shape("æœè±¡å³åœ¢")
# except TypeError as e:
# print(f"ãšã©ãŒ: {e}") # Can't instantiate abstract class Shape with abstract methods area, perimeter
circle = Circle("å", 5)
rectangle = Rectangle("é·æ¹åœ¢", 4, 6)
print(circle.get_info())
print(f"é¢ç©: {circle.area()}, åšå²é·: {circle.perimeter()}")
print(rectangle.get_info())
print(f"é¢ç©: {rectangle.area()}, åšå²é·: {rectangle.perimeter()}")
# ããæœè±¡ã¡ãœãããå®è£
ãå¿ãããšãšã©ãŒã«ãªã
# class Triangle(Shape):
# def __init__(self, name, base, height):
# super().__init__(name)
# self.base = base
# self.height = height
#
# t = Triangle("äžè§åœ¢", 10, 5) # TypeError: Can't instantiate abstract class Triangle with abstract methods area, perimeter
Shapeã¯ã©ã¹ã¯æœè±¡ã¯ã©ã¹ã§ãã、area()ãšperimeter()ã¯æœè±¡ã¡ãœããã§ã。Shapeãç¶æ¿ããCircleãRectangleã¯、ãããã®æœè±¡ã¡ãœãããå¿
ãå®è£
ããªããã°ã€ã³ã¹ã¿ã³ã¹åã§ããŸãã。ããã«ãã、ç°ãªãå³åœ¢ã¯ã©ã¹ã§ã「é¢ç©」ã「åšå²é·」ãèšç®ããæ©èœã¯å¿
ãæã£ãŠãããšããèšèšäžã®ä¿èšŒãåŸãããŸã。
æœè±¡ã¯ã©ã¹ã¯、å€§èŠæš¡ãªã¢ããªã±ãŒã·ã§ã³ã§èšèšã®æéãæç¢ºã«ã、ããŒã éçºã§ã®äžè²«æ§ãä¿ã€äžã§éåžžã«æçšã§ã。
ããªã¢ãŒãã£ãºã :倿§ãªæ¯ãèããçµ±äžçã«æ±ã
「ããªã¢ãŒãã£ãºã (Polymorphism)」ãšã¯、「倿 æ§」ãšèš³ãã、「å€ãã®åœ¢ãæã€」ãšããæå³ã§ã。ãªããžã§ã¯ãæåããã°ã©ãã³ã°ã«ãããŠ、ç°ãªãåã®ãªããžã§ã¯ãã、åãã€ã³ã¿ãŒãã§ãŒã¹(ã¡ãœããå)ãéããŠç°ãªãæ¯ãèããããããšãæããŸã。
ç¶æ¿ã¯、ãã®ããªã¢ãŒãã£ãºã ãå®çŸããããã®éèŠãªææ®µã®äžã€ã§ã。å
ã»ã©ã®Animalã¯ã©ã¹ãšDog/Catã¯ã©ã¹ã®äŸãæãåºããŠãã ãã。
class Animal:
def __init__(self, name):
self.name = name
def speak(self):
print(f"{self.name}ãäœãã話ããŠããŸã。")
class Dog(Animal):
def speak(self):
print(f"{self.name}ã¯ã¯ã³ã¯ã³ãšå ããŸã!")
class Cat(Animal):
def speak(self):
print(f"{self.name}ã¯ãã£ãŒãšé³ŽããŸã。")
# ç°ãªãåã®ãªããžã§ã¯ãããªã¹ãã«æ ŒçŽ
animals = [Animal("åç¡ããã"), Dog("ãžã§ã³"), Cat("ãã±")]
# ãªã¹ãå
ã®åãªããžã§ã¯ãã«å¯ŸããŠåãspeak()ã¡ãœãããåŒã³åºã
for animal in animals:
animal.speak()
åºåçµæã¯æ¬¡ã®ããã«ãªããŸã。
åç¡ããããäœãã話ããŠããŸã。
ãžã§ã³ã¯ã¯ã³ã¯ã³ãšå ããŸã!
ãã±ã¯ãã£ãŒãšé³ŽããŸã。
èŠãŠã®éã、animalsãªã¹ãã«ã¯Animal、Dog、Catãšããç°ãªãã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ãå«ãŸããŠããŸã。ããã、ã«ãŒãå
ã§animal.speak()ãšåãã³ãŒããèšè¿°ããã ãã§、ããããã®ã€ã³ã¹ã¿ã³ã¹ããã®åã«å¿ããé©åãªspeak()ã¡ãœãã(ãªãŒããŒã©ã€ããããã¡ãœãã)ãå®è¡ããŠããŸã。
ãããããªã¢ãŒãã£ãºã ã®åã§ã。éçºè ã¯、åã ã®ãªããžã§ã¯ãã®å ·äœçãªåãæ°ã«ããããšãªã、å ±éã®ã€ã³ã¿ãŒãã§ãŒã¹ãéããŠæäœã§ãããã、ã³ãŒãã®æè»æ§、æ¡åŒµæ§、ä¿å®æ§ãé£èºçã«åäžããŸã。
✅ ãã€「ç¶æ¿」ã䜿ãã¹ãã?ãã¹ããã©ã¯ãã£ã¹
ç¶æ¿ã¯åŒ·åãªããŒã«ã§ãã、äžèœã§ã¯ãããŸãã。æ£ãã䜿ãããšã§ãã®ç䟡ãçºæ®ããŸã。ã§ã¯、ã©ã®ãããªå Žåã«ç¶æ¿ã䜿ãã¹ããªã®ã§ãããã?
ç¶æ¿ã䜿ãã¹ãã±ãŒã¹:「is-a」ã®é¢ä¿
ç¶æ¿ãæãé©ããŠããã®ã¯、「〇〇ã¯△△ã®äžçš®ã§ãã (is-a)」ãšããé¢ä¿ãæãç«ã€å Žåã§ã。
Dogis aAnimal(ç¬ã¯åç©ã®äžçš®ã§ãã)Caris aVehicle(è»ã¯ä¹ãç©ã®äžçš®ã§ãã)Circleis aShape(åã¯å³åœ¢ã®äžçš®ã§ãã)
ãã®ãããªé¢ä¿æ§ããããšã、åã¯ã©ã¹ã¯èŠªã¯ã©ã¹ã®「ç¹æ®å」ã§ãã、芪ã¯ã©ã¹ã®å šãŠã®ç¹æ§ãå ±æãã€ã€、ç¬èªã®ç¹æ§ãæ¯ãèãã远å ・倿ŽããŸã。
ç¶æ¿ã®äž»ãªã¡ãªãã:
- ã³ãŒãã®åå©çšæ§: 芪ã¯ã©ã¹ã«å ±éã®æ©èœãèšè¿°ããã ãã§、åã¯ã©ã¹ã¯ãããåå©çšã§ãããã、ã³ãŒãã®éè€ãæžããŸã。
- ä¿å®æ§ã®åäž: å ±éæ©èœã®ä¿®æ£ã¯èŠªã¯ã©ã¹ã®äžç®æã§æžããã、倿Žã®åœ±é¿ç¯å²ãéå®ãããããªããŸã。
- æ¡åŒµæ§ã®åäž: æ°ããçš®é¡ã®ã¯ã©ã¹ã远å ããéã«、æ¢åã®èŠªã¯ã©ã¹ãç¶æ¿ããããšã§、æè»œã«å ±éæ©èœãå°å ¥ã、ç¬èªã®æ©èœã远å ã§ããŸã。
- ããªã¢ãŒãã£ãºã ã®å®çŸ: ç°ãªãåã¯ã©ã¹ãå ±éã®èŠªã¯ã©ã¹ã®åãšããŠæ±ãããšã§、æè»ãªããã°ã©ã èšèšãå¯èœã«ãªããŸã。
ç¶æ¿ã®èœãšã穎ãšä»£æ¿ææ®µ(ã³ã³ããžã·ã§ã³):「has-a」ã®é¢ä¿
ç¶æ¿ã¯åŒ·åã§ããåé¢、äœ¿ãæ¹ã誀ããš「å¯çµå」ãçã¿åºã、ã³ãŒããè匱ã«ããŠããŸãå¯èœæ§ããããŸã。
ç¶æ¿ã®ãã¡ãªãã:
- å¯çµå: 芪ã¯ã©ã¹ãšåã¯ã©ã¹ã¯éåžžã«åŒ·ãçµã³ã€ããŸã。芪ã¯ã©ã¹ã®å€æŽã、æå³ããå šãŠã®åã¯ã©ã¹ã«åœ±é¿ãäžããŠããŸã「è匱ãªåºåºã¯ã©ã¹åé¡」ãåŒãèµ·ããããšããããŸã。
- æè»æ§ã®æ¬ åŠ: äžåºŠç¶æ¿é¢ä¿ã確ç«ãããš、å®è¡æã«ãã®é¢ä¿ã倿Žããããšã¯ã§ããŸãã。
- éå±€æ§é ã®è€éå: ç¶æ¿ã®éå±€ãæ·±ããªããš、ã¯ã©ã¹ã®å šäœåãææ¡ãã«ãããªã、ã³ãŒãã®å¯èªæ§ãäœäžããŸã。
ããã§、ããäžã€ã®éèŠãªãªããžã§ã¯ãæåã®æŠå¿µã§ãã「ã³ã³ããžã·ã§ã³(åæ)」ãä»£æ¿ææ®µãšããŠããçšããããŸã。
ã³ã³ããžã·ã§ã³ã¯、「〇〇ã¯△△ãæã£ãŠãã (has-a)」ãšããé¢ä¿ã§ãªããžã§ã¯ããæ§ç¯ããææ³ã§ã。ããã¯ã©ã¹ãå¥ã®ã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ã「éšå」ãšããŠæã¡、ãã®éšåã®æ©èœãå©çšããŸã。
äŸãã°、「è» (Car) ã¯ãšã³ãžã³ (Engine) ãæã£ãŠãã」ãšããé¢ä¿ã§ã。
class Engine:
def start(self):
print("ãšã³ãžã³ãããããŸãã!")
def stop(self):
print("ãšã³ãžã³ã忢ããŸãã。")
class Car:
def __init__(self, brand):
self.brand = brand
self.engine = Engine() # Carã¯Engineã®ã€ã³ã¹ã¿ã³ã¹ãæã£ãŠãã (has-a)
def drive(self):
print(f"{self.brand}ãèµ°è¡ããŸã。")
self.engine.start() # ãšã³ãžã³ã®æ©èœãå©çš
def park(self):
print(f"{self.brand}ãé§è»ããŸãã。")
self.engine.stop()
my_car = Car("ãã§ã©ãŒãª")
my_car.drive()
my_car.park()
ãã®äŸã§ã¯、Carã¯ã©ã¹ã¯Engineã¯ã©ã¹ãç¶æ¿ããŠããŸãã。ãã®ä»£ããã«、Engineã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ãCarã¯ã©ã¹ã®å±æ§ãšããŠæã¡、ãã®æ©èœã䜿ã£ãŠããŸã。
ã³ã³ããžã·ã§ã³ã®ã¡ãªãã:
- ççµå: ã¯ã©ã¹éã®çµå床ãäœã、çæ¹ã®ã¯ã©ã¹ã倿ŽããŠãããäžæ¹ã«äžãã圱é¿ãå°ãªãã§ã。
- æè»æ§: å®è¡æã«éšåãå·®ãæ¿ããã、è€æ°ã®éšåãçµã¿åããããããããšã容æã§ã。
- ã·ã³ãã«ãªæ§é : è€éãªç¶æ¿éå±€ãé¿ã、ããçè§£ããããæ§é ãä¿ãŠãŸã。
「ç¶æ¿ãããã³ã³ããžã·ã§ã³ãåªå ãã (Prefer composition over inheritance)」ãšããæåãªèšèšååãããã»ã©、ã³ã³ããžã·ã§ã³ã¯æè»ã§å ç¢ãªèšèšãå¯èœã«ããéèŠãªèãæ¹ã§ã。
ãŸãšãããš、ãã䜿ãåããŸããã。
- is-a é¢ä¿(ç¹æ®å): 「〇〇ã¯△△ã®äžçš®ã§ãã」ãšæç¢ºã«èšããå Žå → ç¶æ¿
- has-a é¢ä¿(éšåå): 「〇〇ã¯△△ãæã£ãŠãã」ãšããé¢ä¿ã§、æ©èœãçµã¿åãããŠäœ¿ãããå Žå → ã³ã³ããžã·ã§ã³
ð¡ ãŸãšã:Pythonã®ç¶æ¿ã䜿ãããªã、ã¯ã³ã©ã³ã¯äžã®éçºè ãž!
Pythonã®「ç¶æ¿」ã«ã€ããŠ、ãã®åºæ¬ããå¿çš、ãããŠäœ¿ãã©ãããŸã§、培åºçã«æãäžããŠããŸãã。
ãã®èšäºã§åŠãã ããšãæ¯ãè¿ã£ãŠã¿ãŸããã。
- ç¶æ¿ã®åºæ¬: 芪ã¯ã©ã¹(ã¹ãŒããŒã¯ã©ã¹)ã®å±æ§ãã¡ãœããã、åã¯ã©ã¹(ãµãã¯ã©ã¹)ãåŒãç¶ãã§åå©çšããä»çµã¿。
class Child(Parent):ã§å®çŸ©ãã。 - ã¡ãœããã®ãªãŒããŒã©ã€ã: åã¯ã©ã¹ã§èŠªã¯ã©ã¹ãšåãååã®ã¡ãœãããå®çŸ©ããããšã§、èŠªã®æ©èœãäžæžãã、ç¬èªã®æ¯ãèããå®è£ ã§ãã。
super()ã®æŽ»çš: ãªãŒããŒã©ã€ããã€ã€èŠªã¯ã©ã¹ã®ã¡ãœãã(ç¹ã«__init__)ãåŒã³åºãããšã§、èŠªã®æ©èœãåå©çšããªããåã¯ã©ã¹ã®åæåãåŠçãèšè¿°ã§ãã。- å€éç¶æ¿: Pythonã¯è€æ°ã®èŠªã¯ã©ã¹ããã®ç¶æ¿ããµããŒãããã、è€éæ§ããã€ã€ã¢ã³ãåé¡ã«æ³šæã、æ éã«å©çšãã¹ã。
- æœè±¡ã¯ã©ã¹ãšæœè±¡ã¡ãœãã:
abcã¢ãžã¥ãŒã«ã䜿ã£ãŠ、åã¯ã©ã¹ã«ç¹å®ã®ã¡ãœããã®å®è£ ã匷å¶ã、èšèšã®äžè²«æ§ãä¿ã€ããã®åŒ·åãªããŒã«。 - ããªã¢ãŒãã£ãºã : ç°ãªãåã®ãªããžã§ã¯ããå ±éã®ã€ã³ã¿ãŒãã§ãŒã¹ã§çµ±äžçã«æ±ãã、ãªããžã§ã¯ãæåã®éèŠãªç¹åŸŽ。ç¶æ¿ã«ãã£ãŠå®çŸããã。
- ç¶æ¿ã®äœ¿ãåã: 「is-a」ã®é¢ä¿æ§ãæãç«ã€å Žåã«ç¶æ¿ã䜿ã、ãã以å€ã®å Žåã¯「has-a」ã®é¢ä¿ã§ããã³ã³ããžã·ã§ã³ãæ€èšãã。
ç¶æ¿ã¯、ã³ãŒãã®åå©çšæ§ãé«ã、ä¿å®æ§ãåäžãã、æè»ãªæ©èœæ¡åŒµãå¯èœã«ãã、ãªããžã§ã¯ãæåããã°ã©ãã³ã°ã®éåžžã«åŒ·åãªããŒã«ã§ã。ããã、ãã®åãæå€§éã«åŒãåºãããã«ã¯、ãã€、ã©ã®ããã«äœ¿ãã¹ãããçè§£ããããšãéèŠã§ã。
ãã®èšäºã§åŸãç¥èããã²å®éã®ã³ãŒãã£ã³ã°ã§è©ŠããŠã¿ãŠãã ãã。æãåãã、詊è¡é¯èª€ããããšã§、ããªãã®Pythonããã°ã©ãã³ã°ã¹ãã«ã¯ééããªã次ã®ã¬ãã«ãžãšåŒãäžããããã§ããã。
ãã、ç¶æ¿ããã¹ã¿ãŒããŠ、ãã£ãšã¹ããŒãã§å¹ççãªPythonéçºã楜ããã§ãã ãã!
I love codes. I also love prompts (spells). But I get a lot of complaints (errors). I want to be loved by both of you as soon as possible.