Tiếp tục với series, bài này mình sẽ giới thiệu với mọi người về Abstraction (Trừu tượng) trong Python. Đây là một trong bốn tính chất đặc trưng của hướng đối tượng, nhưng ở phần này mình sẽ không nhắc về lý thuyết nhiều, bạn nào cần thì có thể tham khảo tại đây.
1, Abtract class là gì?
Abstract class là một class mà bên trong nó chứa một hoặc nhiều phương thức trừu tượng. Phương thức trừu tượng ở đây là một phương thức mà chúng ta chỉ được phép khai báo nó và không được phép viết code thực thi nó. Khi một class được khai báo ở dạng abstract thì nó sẽ không thể nào khởi tạo được, mà chỉ có thể khởi tạo được thông qua các class con của nó. Một class kế thừa lại abstract class thì phải khai báo lại toàn bộ các phương thức trừu tượng bên trong abstract class mà nó kế thừa.
2, Khai báo abstract class trong Python.
Để có thể khai báo được một abstract class trong Python, thì class này bắt buộc phải được kế thừa từ một ABC (Abstract Base Classes) của Python
Và để gọi được class này trong chương trình thì bạn phải import nó. Cú pháp import như sau:
from abc import ABC
Cú pháp khai báo abstract class:
class ClassName(ABC):
# code
Trong đó: ClassName là tên của abstract class mà bạn muốn khai báo.
VD: Mình sẽ khai báo một lớp trừu tượng person.
from abc import ABC, abstractmethod
class PersonAbstact(ABC):
name = None
age = 0
def getName(self):
print(self.name)
def getAge(self):
print(self.age)
Vì abstract class là một class, nên các bạn có thể hoàn toàn khai báo thuộc tính và phương thức như một class bình thường.
3, Khai báo phương thức abstract trong Python.
Để có thể khai báo một abstract method - phương thức trừu tượng trong Python thì chúng ta cần phải import thêm module abstractmethod
ở trong package abc.
from abc import ABC, abstractmethod
Và một phương thức trừu tượng thì bắt buộc phải được khai báo ở trong lớp trừu tượng.
Cú pháp:
from abc import ABC, abstractmethod
class ClassName(ABC):
# khai bao phuong thuc truu tuong
@abstractmethod
def methodName(self):
pass
Trong đó:
@abstractmethod
là bắt buộc, đây là cú pháp khai báo cho Python biết phía dưới là phương thức trừu tượng.methodName
là tên của phương thức trừu tượng.
VD: Mình sẽ khai báo thêm phương thức trừu tượng getFull
vào trong PersonAbstract
của VD trên.
from abc import ABC, abstractmethod
class PersonAbstact(ABC):
name = None
age = 0
def getName(self):
print(self.name)
def getAge(self):
print(self.age)
@abstractmethod
def getFull(self):
pass
4, Các Ví Dụ.
Đầu tiên, để chứng mình là abstract class không thể khởi tạo được một các trực tiếp thì mình sẽ thử khởi tạo class PersonAbstract
ở ví dụ trên xem sao:
from abc import ABC, abstractmethod
class PersonAbstact(ABC):
name = None
age = 0
def getName(self):
print(self.name)
def getAge(self):
print(self.age)
@abstractmethod
def getFull(self):
pass
PersonAbstact()
# Lỗi
# Can't instantiate abstract class PersonAbstact with abstract methods getFull
Ok nó đã báo lỗi. Bây giờ mình sẽ tạo một class và kết thừa lại PersonAbstract
này và đồng thời khởi tạo nó xem sao.
from abc import ABC, abstractmethod
class PersonAbstact(ABC):
name = None
age = 0
def getName(self):
print(self.name)
def getAge(self):
print(self.age)
@abstractmethod
def getFull(self):
pass
class Person(PersonAbstact):
pass
Person();
# Lỗi
# Can't instantiate abstract class Person with abstract methods getFull
Nó vẫn báo lỗi, bây giờ ở class con này chúng ta sẽ khai báo lại method getFull và khởi tạo lại nó.
from abc import ABC, abstractmethod
class PersonAbstact(ABC):
name = None
age = 0
def getName(self):
print(self.name)
def getAge(self):
print(self.age)
@abstractmethod
def getFull(self):
pass
class Person(PersonAbstact):
name = 'Vu Thanh Tai'
age = 22
def getFull(self):
self.getName()
self.getAge()
Person();
Lúc này chương trình đã không báo lỗi gì nữa. Bây giờ chúng ta sẽ gọi thử phương thức getFull xem sao.
from abc import ABC, abstractmethod
class PersonAbstact(ABC):
name = None
age = 0
def getName(self):
print(self.name)
def getAge(self):
print(self.age)
@abstractmethod
def getFull(self):
pass
class Person(PersonAbstact):
name = 'Vu Thanh Tai'
age = 22
def getFull(self):
self.getName()
self.getAge()
Person().getFull();
# Kết Quả:
# Vu Thanh Tai
# 22
OK, nó đã cho ra kết quả.
5, Lời kết.
Như vậy phần này mọi người cần phải chú ý những điều sau:
- Abstract là một class, và class này chứa một hoặc nhiều phương thức trừu tượng.
- Abstract class không thể khởi tạo trực tiếp được.
- Một class kế thừa từ abstract class thì bắt buộc phải khai báo lại các các phương thức trừu tượng có trong abstract mà nó kết thừa.
Đăng ký nhận tin.
Chúng tôi chỉ gửi tối đa 2 lần trên 1 tháng. Tuyên bố không spam mail!
Bài viết rất thú vị, cảm ơn tác giả rất nhiều.
Hoàng
5 năm trước
Như bác nơi 1 abstract class ko thể implement các method nhưng trong vd mình thấy def getName(self): print(self.name) def getAge(self):và nó vẫn work cho hỏi tại sao vậy
Điền Trần
5 năm trước
Nguyễn Khánh Toàn
4 năm trước
không biết code
2 tháng trước