DANH MỤC: PYTHON NÂNG CAO

Bài 3: Kế thừa class trong Python


Nhắc đến hướng đối tượng, thì chúng ta sẽ phải nhắc về 4 tính chất đặc thù của nó là trừu tượng, kế thừa, đóng gói và đa đa hình. Bài hôm nay chúng ta sẽ tìm hiểu về kế thừa trong Python hướng đối tượng.

1, Kế thừa là gì?

Kế thừa là sử dụng lại một cái gì đó đã có vào trong cái mới để phát triển ra cái mới.

Khái niệm kia quá ngắn phải không các bạn? Nếu như bạn quá khó hình dung thì cá bạn có thể xem qua ví dụ sau:

VD: Ví dụ như một chiếc xe đạp điện được kế thừa lại bộ khung và kết cấu của một chiếc xe đạp từ đó lắp ráp thêm động cơ và một số thành khác để trở thành một chiếc xe đạp.

2, Kế thừa trong lập trình.

Giả sử bạn được sếp giao cho một task viết 2 class MaleFemal chứa 2 phương thức getName,getAge. Nếu như bạn không sử dụng tính kế thừa trong hướng đối tượng thì bạn sẽ phải viết 2 class có các phương thức và thuộc tính tương đối giống nhau như trên. Nhưng thay vào đó nếu như bạn nhận thấy 2 class này có các điểm chung giống nhau thì bạn có thể tạo ra một class cha chứa những điểm chúng này, từ đó ở mỗi class con sẽ kế thừa những điểm chung đó và phát triển thêm các điểm riêng. Thay vì phải viết lại như trước....

3, Kế thừa trong Python.

Trong Python để khai báo một class kết thừa từ một hoặc nhiều class thì các bạn sử dụng cú pháp:

class className(inherit1, inherit2,...):
    #code

Trong đó: Cú pháp khai báo class thì mình đã giới thiệu với mọi người ở bài trước rồi. inherit1, inherit2,... là tên của các class mà bạn muốn kế thừa.

VD: Mình sẽ viết 1 class Person và một class Male kế thừa từ class Person.

class Person:
    def __init__(self, name, age):
        self.name, self.age = name, age
    
    def getName(self):
        print("Name: %s" %(self.name))
    
    def getAge(self):
        print("Age: %d" %(self.age))
    def getSex(self):
        print("Sex: %s" %(self.sex))

class Male(Person):
    sex = "Male";

Lúc này class Male sẽ sử dụng được toàn bộ các phương thức và thuộc tính của class Person (trong VD trên).

VD: Mình sẽ khởi tạo class Male và gọi một vài phương thức được khai báo trong lớp cha của nó.

male = Male("Vũ Thanh Tai", 22)
male.getName()
male.getAge()
male.getSex()

# Ket qua:
# Name: Vu Thanh Tai
# Age: 22
# Sex: Male

Như các bạn đã thấy, trong class Male hoàn toàn không chứa một phương thức nào nhưng do nó được kế thừa từ class Person nên nó sẽ sử dụng lại được những thành phần được cho phép trong class Person.

4, Ghi đè phương thức và thuộc tính.

Ghi đè

Trong trường hợp cả hai class cha và con tồn tại các thuộc tính và phương thức có cũng tên, thì trong Python sẽ nó sẽ ưu tiên thực thi và gọi các phương thức và thuộc tính khai báo trong class được khởi tạo.

VD:

class Foo:
    name = 'Foo'
    def getName(self):
        print("Class: Foo")
class Bar(Foo):
    name = 'Bar'
    def getName(self):
        print("Class: Bar")

print(Foo().name)
Foo().getName()
print(Bar().name)
Bar().getName()

# Ket qua:
# Foo
# Class: Foo
#
# Bar
# Class: Bar

Như các bạn thấy, thì khi chúng ta khởi tạo class nào thì nó sẽ ưu tiên đến các thành phần trong class đó hơn.

Super()

Trong trường hợp ở class con mà bạn muốn sử dụng đến các thành phần trong class cha thì bạn phải sử dụng hàm super theo cú pháp sau:

# Đối với thuộc tính.
super().variableName
# Đối với phương thức.
super().methodName()

VD: Mình sẽ gọi phương thức getName và thuộc tính name của class Foo khi đang đứng ở trong class Bar.

class Foo:
    name = 'Foo'
    def getName(self):
        print("Class: Foo")
        
class Bar(Foo):
    name = 'Bar'
    def getName(self):
        print("Atribute name = " + super().name)
        super().getName()

Bar().getName()
# Ket qua:
# Atribute name = Foo
# Class: Foo

5, Đa kế thừa trong Python.

Cũng giống như C++ thì Python cũng hỗ trợ chúng ta đa kế thừa. Về phần cú pháp thì mình nó ở trên rồi nên ở phần này mình chỉ VD thôi.

VD: Đa kế thừa.

class First:
    def getFirst(self):
        print("Class Fist")
        
class Second:
    def getSecond(self):
        print("Class Second")

class Third(First, Second):
    def getThird(self):
        print("Class Third")

third = Third()
third.getFirst()
third.getSecond()
third.getThird()

# Kết Quả:
# Class Fist
# Class Second
# Class Third

Về Phần ghi đè thì vẫn như cũ là: Nó sẽ ưu tiên thành phần được khai báo trong lớp được khởi tạo.

Trong đa kế thừa nếu như bạn sử dụng super() thì nó sẽ gọi đến thành phần trong class kế thừa được truyền vào đầu tiên trong argument của class con.

VD:

class First:
    def getClass(self):
        print("Class Fist")

class Second:
    def getClass(self):
        print("Class Second")
        
class Third(First, Second):
    def getClass(self):
        super().getClass()

third = Third()
third.getClass()

# Kết Quả:
# Class Fist

Như các bạn đã thấy, do class First được truyền vào đầu tiên nên khi sử dụng super thì nó sẽ tìm đến thành phần được gọi ở trong class First.

Trong trường hợp bạn muốn gọi cả phương thức getName() trong class Second nữa thì bạn cần thay đổi code một chút như sau:

class First:
    def getClass(self):
        print("Class Fist")
        super().getClass()

class Second:
    def getClass(self):
        print("Class Second")
        
class Third(First, Second):
    def getClass(self):
        super().getClass()

third = Third()
third.getClass()

# Kết Quả:
# Class Fist
# Class Second

Tính chất đa kế thừa của Python thực chất là dựa vào Tính chất bắc cầu, A Kế thừa B và B kế thừa C => A cũng kế thừa B,

Hay nói đơn giản trong Ví dụ trên chúng ta có thể chuyển về dạng bắc cầu như sau:

class First:
    def getClass(self):
        print("Class Fist")
        

class Second(First):
    def getClass(self):
        super().getClass()
        print("Class Second")    
        
class Third(Second):
    def getClass(self):
        super().getClass()

third = Third()
third.getClass()

# Kết Quả:
# Class Fist
# Class Second

Các bạn thấy đó kết quả trả về là như nhau.

Từ đó ta có thể hiểu rằng vị trí các tham số argument truyền vào trong class con càng đứng phía sau nó càng có cấp cao hơn class phía trước nó.

6, Lời kết.

Phần này mình chỉ trình bày đến đây thôi còn các phần nâng cao hơn nữa, mình sẽ trình bày ở các bài tiếp theo.

Nguồn: Toidicode.com

Thông tin tác giả

Vũ Thanh Tài

Vũ Thanh Tài

Biển học vô biên, quay đầu là dại!

Hãy tham gia group facebook để cùng giao lưu chia sẻ kiến thức! Tham Gia