---
title: Class 繼承與覆寫 (tc)
description: Python class 繼承（extend）與覆寫方法（override）的完整範例——Manager 繼承 Employee 並改寫 get_employee_info，Department 用 class method 管理員工。
url: "https://aaronchan.com/zh/kb/python-class-inheritance/"
updated: "2026-09-15"
category: "Code-Python (tc)"
---

# Class 繼承與覆寫 (tc)

這個範例看 class 如何繼承（extend）和覆寫方法（override）。Employee 是基本 class，Manager 繼承它再加 department 欄位，還將 get_employee_info 改寫成自己版本。Department 用 class method 管理整班員工。

 Copy

```
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__ 減一，追蹤總人數。
