类属性 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:
    # 定义类属性
    # 无 self. 语法
    MIN_SALARY = 30000 

def __init__(self, name, salary): self.name = name # 使用类名 # 访问类属性 if salary >= Employee.MIN_SALARY: self.salary = salary
else: self.salary = Employee.MIN_SALARY
  • MIN_SALARY 在所有实例间共享
  • 定义类属性时不要用 self
  • 按约定使用全大写
  • ClassName.ATTR_NAME 访问类属性值
Python 面向对象编程入门

类级属性

class Employee:
    # 定义类属性
    MIN_SALARY = 30000    

def __init__(self, name, salary): self.name = name # 使用类名 # 访问类属性 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)

# 更新 emp1 的 MIN_SALARY emp1.MIN_SALARY = 50000
# 分别打印两位员工的 MIN_SALARY print(emp1.MIN_SALARY) print(emp2.MIN_SALARY)
50000
30000
Python 面向对象编程入门

修改类级属性

  • MIN_SALARY 在类定义中创建

 

  • 更新某个对象的 MIN_SALARY 不会影响类定义中的值

 

  • 安全性——防止对软件的未授权更改!
Python 面向对象编程入门

为何使用类属性?

与类相关的全局常量

 

  • 属性的最小/最大值
    • 防止无效数据
  • 常用值与常量,如 Database 类的 hostport
    • 创建对象时避免重复
Python 面向对象编程入门

Passons à la pratique !

Python 面向对象编程入门

Preparing Video For Download...