Dữ liệu của thể hiện và của lớp

Lập trình hướng đối tượng trong Python

Alex Yarosh

Content Quality Analyst @ DataCamp

Nguyên lý cốt lõi của OOP

 

Kế thừa:

  • Mở rộng chức năng của mã hiện có

Đa hình:

  • Tạo giao diện thống nhất

Đóng gói:

  • Gói gọn dữ liệu và phương thức
Lập trình hướng đối tượng trong Python

Dữ liệu cấp thể hiện

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

emp1 = Employee("Teo Mille", 50000) 
emp2 = Employee("Marta Popov", 65000)
  • name, salarythuộc tính thể hiện
  • self gắn với một thể hiện
Lập trình hướng đối tượng trong Python

Dữ liệu cấp lớp

  • Dữ liệu dùng chung cho mọi thể hiện của một lớp
  • Định nghĩa thuộc tính lớp trong phần thân class
class MyClass:
    # Define a class attribute
    CLASS_ATTR_NAME = attr_value


  • "Biến toàn cục" trong phạm vi lớp
Lập trình hướng đối tượng trong Python

Dữ liệu cấp lớp

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 được chia sẻ giữa mọi thể hiện
  • Không dùng self để định nghĩa thuộc tính lớp
  • dùng ClassName.ATTR_NAME để truy cập giá trị thuộc tính lớp
Lập trình hướng đối tượng trong Python

Dữ liệu cấp lớp

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
Lập trình hướng đối tượng trong Python

Vì sao dùng thuộc tính lớp?

Hằng số toàn cục liên quan đến lớp

 

  • giá trị nhỏ nhất/lớn nhất cho thuộc tính
  • các giá trị và hằng số dùng chung, ví dụ pi cho lớp Circle
  • ...
Lập trình hướng đối tượng trong Python

Phương thức lớp

  • Phương thức đã "dùng chung": cùng mã cho mọi thể hiện
  • Phương thức lớp không dùng được dữ liệu cấp thể hiện
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...)
Lập trình hướng đối tượng trong Python

Hàm tạo thay thế

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
  • Chỉ có một __init__()

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

  • Dùng phương thức lớp để tạo đối tượng
  • Dùng return để trả về đối tượng
  • cls(...) sẽ gọi __init__(...)
Lập trình hướng đối tượng trong Python

Hàm tạo thay thế

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)        

tệp văn bản chứa một dòng với tên nhân viên

# Tạo một nhân viên mà không gọi Employee()
emp = Employee.from_file("employee_data.txt")
type(emp)
__main__.Employee
Lập trình hướng đối tượng trong Python

Ayo berlatih!

Lập trình hướng đối tượng trong Python

Preparing Video For Download...