07_類別與物件

類別

  • 像是模板
  • 用於產生同類的物件
  • 相關方法可重複使用
  • Python慣用Camel case命名類別

建立類別

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()

建立子類別

  • 繼承母類別的所有函數
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()

不同物件的互動

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)

模擬銀行帳戶

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.