Python: super()


Khóa học qua video:
Lập trình Python All Lập trình C# All SQL Server All Lập trình C All Java PHP HTML5-CSS3-JavaScript
Đăng ký Hội viên
Tất cả các video dành cho hội viên

1. Truy cập hàm tạo của lớp cha

Python cho phép từ hàm tạo của lớp con truy cập hàm tạo của lớp cha bằng cách sử dụng super().

Ví dụ ta có lớp Animal như sau:

#tạo lớp Animal:
class Animal:
  #hàm tạo 3 tham số
  def __init__(self,id,name,age):
    self.id = id
    self.name = name
    self.age = age

  #phương thức nhập liệu
  def inputInfo(self):
    self.id=input("Input id: ")
    self.name=input("Input name: ")
    self.age=input("Input age: ")

  #phương thức hiển thị thông tin đối tượng
  def showInfo(self):
    print("ID: ",self.id)
    print("Name: ",self.name)
    print("Age: ",self.age)

Bây giờ ta cần xây dựng lớp Cat thừa kế lớp Animal, trong đó lớp Cat có thêm thuộc tính color để thể hiện màu sắc của mèo, thì ta làm như sau:

class Cat(Animal):
  def __init__(self,id,name,age,color):
    super().__init__(id,name,age) #dùng super() để gọi đến hàm tạo của lớp cha 
    self.color=color

2. Truy cập các thành phần của lớp cha

Nếu phương thức của lớp con ghi đè phương thức của lớp cha thì ta có thể gọi phương thức bị ghi đè đó của lớp cha bằng cách sử dụng super(). Ta cũng có thể sử dụng super() để tham chiếu tới một trường ẩn nào đó (mặc dù trường ẩn là không khuyến khích) của lớp cha.

Ví dụ ta có lớp Animal như ở phần trên, bây giờ ta cần xây dựng lớp Cat thừa kế từ lớp Animal ở trên và có thêm thuộc tính color để thể hiện màu lông thì ta làm như sau (giống như ở phần trên):

class Cat(Animal):
  def __init__(self,id,name,age,color):
    super().__init__(id,name,age) #dùng super() để gọi đến hàm tạo của lớp cha 
    self.color=color

Thì lớp Cat lúc này sẽ được thừa kế các thuộc tính id, name, age, và thừa kế các phương thức inputInfo() và showInfo() của lớp cha Animal.

Tuy nhiên, phương thức inputInfo() của lớp cha chỉ nhập liệu được cho 3 thuộc tính id, name và age, không thể nhập liệu được cho thuộc tính color.

Để giải quyết điều này thì ta làm như sau:

class Cat(Animal):
  def __init__(self,id,name,age,color):
    super().__init__(id,name,age)
    self.color=color

  def inputInfo(self):
    super().inputInfo() #dùng super() để gọi đến phương thức bị ghi đè inputInfo() của lớp cha
    self.color=input("Input color: ")

Ở đoạn code trên, super() được dùng để gọi phương thức bị ghi đè của lớp cha là inputInfo().

Tương tự, phương thức showInfo() của lớp cha Animal cũng không hiển thị được thông tin thuộc tính color của lớp con Cat.

Trong trường hợp này ta cũng định nghĩa phương thức showInfo() cho lớp Cat và dùng super() để gọi phương thức showInfo() của lớp cha Animal như sau:

class Cat(Animal):
  def __init__(self,id,name,age,color):
    super().__init__(id,name,age)
    self.color=color

  def inputInfo(self):
    super().inputInfo()
    self.color=input("Input color: ")

  def showInfo(self): #dùng super() để gọi đến phương thức bị ghi đè inputInfo() của lớp cha
    super().showInfo()
    print("Color:",self.color)

Dưới đây là chương trình hoàn chỉnh, bạn có thể copy và chạy thử:

#tạo lớp Animal:
class Animal:
  #hàm tạo 3 tham số
  def __init__(self,id,name,age):
    self.id = id
    self.name = name
    self.age = age

  #phương thức nhập liệu
  def inputInfo(self):
    self.id=input("Input id: ")
    self.name=input("Input name: ")
    self.age=input("Input age: ")

  #phương thức hiển thị thông tin đối tượng
  def showInfo(self):
    print("ID: ",self.id)
    print("Name: ",self.name)
    print("Age: ",self.age)

class Cat(Animal):
  def __init__(self,id,name,age,color):
    super().__init__(id,name,age)
    self.color=color

  def inputInfo(self):
    super().inputInfo()
    self.color=input("Input color: ")

  def showInfo(self):
    super().showInfo()
    print("Color:",self.color)

#tạo đối tượng mới:
cat = Cat(1234,"Moon",1.5,"White")
cat.inputInfo()
cat.showInfo()

Kết quả:

Input id: 6789
Input name: Mèo mướp
Input age: 1.5
Input color: Xám đen
ID:  6789
Name:  Mèo mướp
Age:  1.5
Color: Xám đen
» Tiếp: Python Iterator
« Trước: Ghi đè phương thức (Override)
Khóa học qua video:
Lập trình Python All Lập trình C# All SQL Server All Lập trình C All Java PHP HTML5-CSS3-JavaScript
Đăng ký Hội viên
Tất cả các video dành cho hội viên
Copied !!!