屬性

Python 物件導向程式設計

Alex Yarosh

Content Quality Analyst @ DataCamp

變更屬性值

class Employee:
  def set_name(self, name):
    self.name = name 
  def set_salary(self, salary):
    self.salary = salary 
  def give_raise(self, amount):
    self.salary = self.salary + amount

def __init__(self, name, salary): self.name, self.salary = name, salary
emp = Employee("Miriam Azari", 35000)
# Use dot syntax and = to alter atributes
emp.salary = emp.salary + 5000
Python 物件導向程式設計

變更屬性值

class Employee:
  def set_name(self, name):
    self.name = name 
  def set_salary(self, salary):
    self.salary = salary 
  def give_raise(self, amount):
    self.salary = self.salary + amount

def __init__(self, name, salary): self.name, self.salary = name, salary
emp = Employee("Miriam Azari", 35000)
# Use dot syntax and = to alter atributes
emp.salary = emp.salary + 5000

 

 

控制屬性存取?

  • 檢查值是否有效
  • 或將屬性設為唯讀
    • 就算修改 set_salary() 也無法防止 emp.salary = -100
Python 物件導向程式設計

受限與唯讀屬性

import pandas as pd
df = pd.DataFrame({"colA": [1,2], "colB":[3,4]})
df
  colA colB
0    1    3
1    2    4
df.columns = ["new_colA", "new_colB"]
df
  new_colA  new_colB
0    1    3
1    2    4
# will cause an error
df.columns = ["new_colA", "new_colB", "extra"]
df
ValueError: Length mismatch: 
Expected axis has 2 elements, 
new values have 3 elements
df.shape = (43, 27)
df
AttributeError: can't set attribute
Python 物件導向程式設計

@property

class Employer:
  def __init__(self, name, new_salary):
     self._salary = new_salary


@property def salary(self): return self._salary
@salary.setter def salary(self, new_salary):
if new_salary < 0: raise ValueError("Invalid salary") self._salary = new_salary

 

← 使用前綴 _ 的「受保護」屬性來儲存資料

← 對與受限屬性同名的「方法」加上 @property回傳內部屬性

← 對方法 attr() 加上 @attr.setter,當執行 obj.attr = value 時會呼叫

  • 指定的值會以引數傳入
Python 物件導向程式設計

@property

class Employer:
  def __init__(self, name, new_salary):
     self._salary = new_salary


@property def salary(self): return self._salary
@salary.setter def salary(self, new_salary): if new_salary < 0: raise ValueError("Invalid salary") self._salary = new_salary
emp = Employee("Miriam Azari", 35000)
# accessing the "property"
emp.salary
35000
emp.salary = 60000 # <-- @salary.setter
emp.salary = -1000
ValueError: Invalid salary
Python 物件導向程式設計

為什麼用 @property?

  $$\text{\Large{給使用者:像屬性一樣好用}}$$

 

$$\text{\Large{給開發者:可控的存取權}}$$

Python 物件導向程式設計

其他做法

→ 不要加入 @attr.setter

建立唯讀屬性

→ 加入 @attr.getter

用在「取得」屬性值時會被呼叫的方法

→ 加入 @attr.deleter

用在使用 del「刪除」屬性時會被呼叫的方法

Python 物件導向程式設計

一起來練習吧!

Python 物件導向程式設計

Preparing Video For Download...