這個範例看 class 如何繼承(extend)和覆寫方法(override)。Employee 是基本 class,Manager 繼承它再加 department 欄位,還將 get_employee_info 改寫成自己版本。Department 用 class method 管理整班員工。
class Employee:
numberOfEmployee=0
def __init__(self, name, salary, city):
self.name = name
self.salary = salary
self.city = city
Employee.numberOfEmployee += 1
def getInfo(self):
return (f'name:{self.name}, salary:{self.salary}, city:{self.city}')
def getSalary(self):
return self.salary
def get_employee_info(self):
return f'{self.name}, Salary:{self.salary}, City:{self.city}'
def __del__ (self):
Employee.numberOfEmployee -=1
class Manager(Employee):
#extend class
def __init__(self, name, salary, city, department):
super(). __init__(name, salary, city)
self.department = department
#override
def get_employee_info(self):
return f'{self.name} (Manager of {self.department}, City: {self.city})'
class Department:
companyName = 'TTL'
def __init__(self, name):
self.name=name
self.employee=[]
self.budget=0
@classmethod
def getCompanyName(cls):
return cls.companyName
def setBudget(self, amount):
self.budget=amount
return
def getBudget(self):
return self.budget
def addEmployee (self, staff):
self.employee.append(staff)
def getEmployee(self):
return self.employee
def getTotalStaffCost(self):
TotalStaffCost=0
return sum([employee.salary for employee in self.employee])
# for i in self.employee:
# TotalStaffCost += i.salary
# return TotalStaffCost
def getSalaryAverage(self):
return self.getTotalStaffCost()/len(self.employee)
def get_employee_info(self):
return f'{self.name}, {len(self.employee)} employee(s)'
@classmethod
def getNumberOfEmployee(cls):
return cls.numberOfEmployee
@classmethod
def setCompanyName (cls, name):
cls.companyName = name
emp1 = Employee('Peter', 10000, 'KT')
emp2 = Employee('John', 15000, 'HK')
employees = []
employees.append(emp1)
employees.append(emp2)
# print(employees[0].getInfo())
employees.append(Employee('Mary', 50000, 'KT'))
totalSalary=0
for i in employees:
totalSalary += i.getSalary()
print (f'Total Salary= {totalSalary}')
print (f'Average Salary= {totalSalary/len(employees)}')
hr=Department('HR')
it=Department('IT')
hr.addEmployee(Employee('Peter', 10000, 'KT'))
hr.addEmployee(Employee('John', 15000, 'KT'))
hr.addEmployee(Manager('ManagerWong', 30000, 'KT', 'HR Department'))
for employee in hr.employee:
print(employee.get_employee_info())
output:
Total Salary= 75000 Average Salary= 25000.0 Peter, Salary:10000, City:KT John, Salary:15000, City:KT ManagerWong (Manager of HR Department, City: KT)
- 繼承(extend):class Manager(Employee) 括號寫上 parent class,Manager 就自動擁有 Employee 的 attributes 和 methods,不用重寫。
- 覆寫(override):Manager 寫了同名 get_employee_info,內容不同。call Manager 的 object 時用 Manager 版本(看 output 最尾一行,格式不同)。
- class method(@classmethod):第一個參數是 cls(class 本身),不用建立 object 就用得到,例如 getCompanyName。
- class variable:numberOfEmployee 屬 class 級,所有 object 共享。在 __init__ 加一、__del__ 減一,追蹤總人數。
