--- tags: python --- # 07_類別與物件 ## 類別 * 像是模板 * 用於產生同類的物件 * 相關方法可重複使用 * Python慣用Camel case命名類別 ### 建立類別 ```python class Animal: # 用__init__函數設定類別產生物件當下要做的事 # 類別底下的函數第一個參數一定為self def __init__(self, name, age, category): self.name = name self.age = age self.category = category # 可建立該類別可用的函數 def intro(self): print(f'Hi, 我叫{self.name},今年{self.age}歲是一隻{self.category}') def move(self): print(f'{self.name}開始跑來跑去') a1 = Animal('小黑', '3', '狗') a2 = Animal('加菲', '4', '貓') a1.intro() a1.move() a2.intro() a2.move() ``` ### 建立子類別 * 繼承母類別的所有函數 ```python class Dog(Animal): def __init__(self, name, age, breed): Animal.__init__(self, name, age, '狗') self.breed = breed def move(self): print(f'{self.name}開始到處亂跑') def bark(self): print('汪!') a3 = Dog('小白', '5', '馬爾濟斯') a3.intro() a3.move() a3.bark() ``` ### 不同物件的互動 ```python class Human: def __init__(self, name, age): self.name = name self.age = age self.pet = [] # 設定函數傳入一個物件(animal) def adopt_pet(self, animal): self.pet.append(animal) # 將owner屬性設定回animal物件 animal.owner = self.name # 使用animal的name屬性 print(f'{self.name}收養了{animal.name}') dog_1 = Dog('小黃', '7', '米克斯') human_1 = Human('Eric', '28') human_1.adopt_pet(dog_1) ``` ### 模擬銀行帳戶 ```python class BankAccount: def __init__(self, name, cash): self.name = name self.balance = cash print(f'{self.name}開戶成功') self.report() def report(self): print(f'{self.name} 帳戶餘額: {self.balance}') def deposit(self, amount): self.balance += amount print(f'{self.name}成功存款{amount}') self.report() def withdraw(self, amount): # 如果帳戶餘額不夠提款,提前終止函數 if amount > self.balance: print(f'{self.name}提款失敗') # return除了可以回傳值,也可以提前終止函數 return self.balance -= amount print(f'{self.name}成功提款{amount}') self.report() def transfer(self, account, amount): if amount > self.balance: print(f'{self.name}轉帳失敗') self.report() return self.balance -= amount account.balance += amount print(f'{self.name}轉了{amount}給{account.name}') self.report() account1 = BankAccount('Eric', 5000) account2 = BankAccount('Ben', 1000) account1.deposit(10000) account2.withdraw(500) account1.transfer(account2, 2000) ``` > Written with [StackEdit](https://stackedit.io/). <!--stackedit_data: eyJoaXN0b3J5IjpbLTE4MTIwNzM3OTFdfQ== -->