属性

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 面向对象编程

Vamos praticar!

Python 面向对象编程

Preparing Video For Download...