類別屬性 vs. 物件屬性

Python 物件導向程式設計入門

George Boorman

Curriculum Manager, DataCamp

OOP 的核心原則

封裝

  • 將資料與方法打包

繼承

  • 擴充既有程式的功能

多型

  • 建立一致的介面
Python 物件導向程式設計入門

物件層級屬性

class Employee:
    def __init__(self, name, salary):
        self.name = name
        self.salary = salary

emp1 = Employee("Teo Mille", 50000) 
emp2 = Employee("Marta Popov", 65000)
  • namesalary 的值對每個物件都不同
  • self 指派到物件本身
Python 物件導向程式設計入門

類別層級屬性

  • 類別的所有物件共享的資料

 

  • class 主體中定義「類別屬性」

 

  • 類別內的「全域變數」
Python 物件導向程式設計入門

實作類別層級屬性

class Employee:
    # Define a class attribute
    # No self. syntax
    MIN_SALARY = 30000 

def __init__(self, name, salary): self.name = name # Use class name # to access class attribute if salary >= Employee.MIN_SALARY: self.salary = salary
else: self.salary = Employee.MIN_SALARY
  • MIN_SALARY 由所有物件共享
  • 定義類別屬性時不要用 self
  • 慣例使用全大寫
  • ClassName.ATTR_NAME 存取類別屬性的值
Python 物件導向程式設計入門

類別層級屬性

class Employee:
    # Define a class attribute
    MIN_SALARY = 30000    

def __init__(self, name, salary): self.name = name # Use class name # to access class attribute if salary >= Employee.MIN_SALARY: self.salary = salary else: self.salary = Employee.MIN_SALARY
emp1 = Employee("John", 40000)
print(emp1.MIN_SALARY)
30000
emp2 = Employee("Jane", 60000)
print(emp2.MIN_SALARY)
30000
Python 物件導向程式設計入門

修改類別層級屬性

emp1 = Employee("John", 40000)
emp2 = Employee("Jane", 60000)

# Update MIN_SALARY of emp1 emp1.MIN_SALARY = 50000
# Print MIN_SALARY for both employees print(emp1.MIN_SALARY) print(emp2.MIN_SALARY)
50000
30000
Python 物件導向程式設計入門

修改類別層級屬性

  • MIN_SALARY 在類別定義中建立

 

  • 更新某個物件的 MIN_SALARY,不會影響類別定義裡的值

 

  • 安全性:避免軟體被任意修改!
Python 物件導向程式設計入門

為何使用類別屬性?

與類別相關的全域常數

 

  • 屬性的最小與最大值
    • 防止無效資料
  • 常用的值與常數,例如 Database 類別的 hostport
    • 建立物件時避免重複
Python 物件導向程式設計入門

一起來練習吧!

Python 物件導向程式設計入門

Preparing Video For Download...