实例与类数据

Python 面向对象编程

Alex Yarosh

Content Quality Analyst @ 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 体中定义"类属性"
class MyClass:
    # Define a class attribute
    CLASS_ATTR_NAME = attr_value


  • 类内的"全局变量"
Python 面向对象编程

类级数据

class Employee:
  # Define a class attribute
  MIN_SALARY = 30000    #<--- no self. 

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("TBD", 40000)
print(emp1.MIN_SALARY)
30000
emp2 = Employee("TBD", 60000)
print(emp2.MIN_SALARY)
30000
Python 面向对象编程

为何使用类属性?

与类相关的全局常量

 

  • 属性的最小/最大值
  • 常用值和常量,如 Circlepi
  • ...
Python 面向对象编程

类方法

  • 方法已是"共享"的:每个实例运行同一代码
  • 类方法不能使用实例级数据
class MyClass:

  @classmethod                         # <---use decorator to declare a class method

def my_awesome_method(cls, args...): # <---cls argument refers to the class # Do stuff here # Can't use any instance attributes :(
MyClass.my_awesome_method(args...)
Python 面向对象编程

替代构造器

class Employee:
  MIN_SALARY = 30000
  def __init__(self, name, salary=30000):
      self.name = name
      if salary >= Employee.MIN_SALARY:
        self.salary = salary
      else:
        self.salary = Employee.MIN_SALARY
  • 只能有一个 __init__()

  @classmethod
  def from_file(cls, filename):
      with open(filename, "r") as f:
          name = f.readline()
      return cls(name)

  • 用类方法创建对象
  • return 返回对象
  • cls(...) 会调用 __init__(...)
Python 面向对象编程

替代构造器

class Employee:
  MIN_SALARY = 30000
  def __init__(self, name, salary=30000):
      self.name = name
      if salary >= Employee.MIN_SALARY:
        self.salary = salary
      else:
        self.salary = Employee.MIN_SALARY

  @classmethod
  def from_file(cls, filename):
      with open(filename, "r") as f:
          name = f.readline()
      return cls(name)        

包含一行员工姓名的文本文件

# 不直接调用 Employee() 创建对象
emp = Employee.from_file("employee_data.txt")
type(emp)
__main__.Employee
Python 面向对象编程

Passons à la pratique !

Python 面向对象编程

Preparing Video For Download...