Bài viết là tài liệu tham khảo cho khóa đào tạo lập trình C/C++ của STDIO Training.
Tìm hiểu và đăng ký học tại đây.
STDIO Khi nhắc đến lập trình hướng đối tượng, kế thừa không còn là một khái niệm xa lạ nữa. Vậy trong python tính kế thừa sẽ được thể hiện như thế nào? Nó giống và khác gì so với các ngôn ngữ khác? Cách khai báo và dùng nó ra sao? Bài viết này sẽ giải quyết tất cả các câu hỏi được đặt ra.
Nội dung bài viết

Giới thiệu

Khi nhắc đến lập trình hướng đối tượng, kế thừa không còn là một khái niệm xa lạ nữa. Vậy trong python tính kế thừa sẽ được thể hiện như thế nào? Nó giống và khác gì so với các ngôn ngữ khác? Cách khai báo và dùng nó ra sao? Bài viết này sẽ giúp bạn giải quyết tất cả các câu hỏi được đặt ra.

Tiền đề bài viết

Khi tiếp xúc với python, nó thật sự khiến tôi thấy thú vị và muốn nghiên cứu sâu về nó. Trong một lần tham gia chương trình học dành cho những người mới bắt đầu của anh La Kiến Vinh ::  www.stdio.vn/users/index/1/la-kien-vinh, tôi bắt đầu tìm hiểu và lên kế hoạch cho việc xây dựng một chương trình tự học Python cũng như các chương trình khác của STDIO :: www.stdio.vn.

Bài viết nằm trong chuỗi các bài hướng dẫn về ngôn ngữ lập trình Python.

Đối tượng hướng đến

Bài viết hướng đến tất cả các đối tượng muốn quan tâm và muốn tìm hiểu về Python.

Kế thừa

Kế thừa trong lập trình được hiểu đơn giản là sự thừa hưởng, thừa kế các thuộc tính, phương thức từ lớp cha (lớp được kế thừa) và được quyền sử dụng chúng như là của chính bản thân mình (lớp kế thừa). Kế thừa giúp bạn tiết kiệm được thời gian để viết code, dễ dàng bảo trì và mở rộng.

Trong Python có 2 loại kế thừa là đơn kế thừa và đa kế thừa.

Cú pháp

class ChildClass(ParentClass1[, ParentClass2, ...]):
   statement_1
   .
   .
   statement_n

Ví dụ

#!/usr/bin/python
class Animal:
	def __init__(self, genus, age):
		self.genus = genus
		self.age = age
	def say(self):
		pass
		
class Duck(Animal):
	def __init__(self):
		Animal.__init__(self, 'Dog', 10)
		
	def say(self):
			print ("Quack quack!")

Giải thích

  • Dòng 9:  Lớp Duck được khai báo kế thừa từ lớp Animal.
  • Dòng 10: Phương thức __init__ được override từ phương thức __init__ ở lớp cha (lớp Animal).
  • Dòng 11: Cách để gọi một phương thức từ lớp cha.
  • Dòng 13: Phương thức say được override lại từ phương thức say ở lớp cha.

Một số tính chất cần lưu ý

Khi phương thức __init__ ở lớp con không được khai báo, nó sẽ dùng phương thức __init__ ở lớp cha.

Khác với các C++, trong Python chỉ có một loại kế thừa duy nhất là public.

Trong Python các thuộc tính, phương thức của lớp không tồn tại khái niệm protected như ở C++ mà chỉ tồn tại ở dạng private public và chúng được phân biệt dựa theo tên.

  • Kiểu private: Tên được bắt đầu bằng 2 dấu gạch dưới "__" và kết thúc tối đa là 1 dấu gạch dưới. (Ví dụ: __abc, __xyz_, ...)
  • Kiểu public: Tất cả các tên không phải tên của kiểu private và đúng quy tắc đều thuộc kiểu public.

Ví dụ

#!/usr/bin/python
class Animal:
	def __init__(self, genus, age):
		self.genus = genus
		self.age = age
	def say(self):
		pass
		
class Duck(Animal):
	def __init__(self):
		Animal.__init__(self, 'Dog', 10)
		
	def say(self):
		print ("Quack quack!")
	
	def __fly(self):
		print ("Flap flap!")
			
duck = Duck()

duck.__fly()

Kết quả in ra màn hình

C:\Users\Mido\Desktop>demo.py
Traceback (most recent call last):
  File "C:\Users\Mido\Desktop\demo.py", line 21, in <module>
    duck.__fly()
AttributeError: 'Duck' object has no attribute '__fly'

Ở ví dụ trên xảy ra lỗi là bởi vì phương thức __fly trong lớp Duck thuộc kiểu private nên không thể truy cập được từ bên ngoài lớp đó.

Duck Typing

Vì trong Python kiểu dữ liệu là kiểu động nên các lập trình viên thường quan tâm đến các thuộc tính, hàm của các đối tượng hơn là kiểu dữ liệu của chúng. Phong cách này có tên là Duck Typing. Để hiểu rõ hơn tôi cùng các bạn đi xuống ví dụ sau:

Ví dụ

#!/usr/bin/python			
class Person():
	def say(self):
		print ("Hello STDIO!")
		
def quackquack(duck):
	duck.say()
	
person = Person()
quackquack(person)

Ở ví dụ trên tôi thực hiên viết hàm quackquack với mong muốn truyền vào tham số vào là một đối tượng kiểu Duck, tuy nhiên tôi có thể dùng nó với một đối tượng kiểu Person

Lời kết

Qua 2 bài viết về hướng đối tượng trong ngôn ngữ lập trình về Python, tôi hi vọng bạn đọc sẽ có một cái nhìn mới hơn, sâu hơn về OOP. Đừng để tư tưởng của bạn bị gò bó, bị trói buộc lại bởi các lý thuyết mà hãy để nó thoải mái hơn, gần gũi hơn với cuộc sống thực khi đó bạn sẽ thật sự cảm thấy rằng OOP thật sự rất thú vị, dù nó có ở ngôn ngữ nào đi nữa.

Tham khảo

Tài liệu của STDIO TRAINING.

THẢO LUẬN
ĐÓNG