Các nền tảng của Lập trình Hướng đối tượng

Lập trình Hướng đối tượng Nâng cao với Python

Jake Roach

Data Engineer

Định nghĩa lớp

class Person:
  def __init__(self, name, age):
    self.name = name
    self.age = age
    self.height = 0

# This invokes a call to __init__
john = Person("John Casey", 38)
  • Định nghĩa lớp với từ khóa class
  • __init__ là constructor, được gọi khi tạo đối tượng mới
  • self tham chiếu đến thể hiện hiện tại của lớp
Lập trình Hướng đối tượng Nâng cao với Python

Thuộc tính thể hiện

class Person:
  def __init__(self, name, age):
    self.name = name
    self.age = age
# Create an instance of Person
sarah = Person("Sarah Walker", 31)
sarah.age  # Retrieve the age instance attribute
  • Gắn với một đối tượng của lớp
  • Có thể đặt và truy xuất bằng cú pháp self.<attribute-name>
  • Truy cập qua <object-name>.<attribute-name>
Lập trình Hướng đối tượng Nâng cao với Python

Thuộc tính lớp

  • Gắn với chính lớp
  • Có thể truy xuất mà không cần đối tượng của lớp
  • Lưu dữ liệu giống nhau cho mọi đối tượng của lớp
class Person:
  residence = "Planet Earth"
  ...
# Accessed without an instance
print(Person.residence)
Planet Earth
Lập trình Hướng đối tượng Nâng cao với Python

Phương thức thể hiện

class Person:
  ...
  def introduce(self):
      print(f"Hello, my name is {self.name}")
chuck = Person("Chuck", 32)
chuck.introduce()  # Called on a Person object

$$

  • Cần có một đối tượng của lớp để gọi
  • Nhận từ khóa self làm tham số đầu
Lập trình Hướng đối tượng Nâng cao với Python

Phương thức lớp

class Person:
  @classmethod
  def wake_up(cls):
      print("Time to start your day!")
# Calling a class method
Person.wake_up()

$$

  • Được trang trí với @classmethod
  • Gọi không cần đối tượng của lớp
Lập trình Hướng đối tượng Nâng cao với Python

Kế thừa

Kế thừa cho phép tái sử dụng mã giữa các lớp

  • Lớp con (Employee) kế thừa toàn bộ chức năng của lớp cha (Person)
  • Quan hệ "là một"
  • Có thể bổ sung chức năng
    • Thuộc tính
    • Phương thức
class Person:
  def __init__(self, name, age):
    self.name
    self.age = age

  def introduce(self):
      print(f"Hello, my name is {self.name}")
class Employee(Person):
  def __init__(self, name, age, title):
    Person.__init__(self, name, age)
    self.title = title

  def change_position(self, new_title):
      self.title = new_title
Lập trình Hướng đối tượng Nâng cao với Python

Kế thừa

lester = Employee("Lester", 26, "Technician")
lester.introduce()  # Inherited from Person
print(lester.title)
Hello, my name is Lester
Technician
lester.change_position("Cashier")
print(lester.title)
Cashier
Lập trình Hướng đối tượng Nâng cao với Python

super()

class Employee(Person):
  def __init__(self, name, age, title):
    # Uses name of the parent class
    Person.__init__(self, name, age)

    self.title = title
  ...
  • Tên lớp, __init__()

Dùng super()

class Employee(Person):
  def __init__(self, name, age, title):
    # super(), thay cho tên lớp
    super().__init__(name, age)

    self.title = title
  ...
  • super(), __init__()
  • Không cần truyền self
Lập trình Hướng đối tượng Nâng cao với Python

Ghi đè

Lớp con triển khai lại phương thức kế thừa từ lớp cha theo cách mới

class Employee(Person):
  ...
  def introduce(self):
      print(f"""My name is {self.name},
        I am a {self.title}""")
lester = Employee("Lester", 26, "Technician")
lester.introduce()
My name is Lester, I am a Technician
Lập trình Hướng đối tượng Nâng cao với Python

Nạp chồng

class Person:
  def __init__(self, name):
      self.name = name

  def __eq__(self, other):
      return self.name == other.name

$$

  • Tùy biến hành vi toán tử Python cho một lớp
  • __eq__() dùng để nạp chồng ==

$$

$$

$$

$$

# Compare two Person objects
chuck = Person("Charles Carmichael")
charles = Person("Charles Carmichael")
print(chuck == charles)
True
Lập trình Hướng đối tượng Nâng cao với Python

Ayo berlatih!

Lập trình Hướng đối tượng Nâng cao với Python

Preparing Video For Download...