Cổng Khoa học Máy tính dành cho những người yêu thích máy tính. Nó bao gồm các bài báo về khoa học máy tính và lập trình được viết tốt, tư duy tốt và được giải thích tốt, các câu đố và thực hành / lập trình cạnh tranh / các câu hỏi phỏng vấn công ty.

Bạn đang xem : lớp cơ sở trong python

Bạn đã bao giờ nghĩ đến việc kiểm tra xem các đối tượng bạn đang sử dụng có tuân theo một đặc điểm kỹ thuật cụ thể không? Cần phải xác minh xem một đối tượng có triển khai một phương thức hoặc thuộc tính nhất định hay không, đặc biệt là trong khi tạo một thư viện nơi các nhà phát triển khác sử dụng nó. Nhà phát triển có thể sử dụng các phương thức hasattr hoặc isinstance để kiểm tra xem thông tin đầu vào có tuân theo một danh tính cụ thể hay không. Nhưng đôi khi thật bất tiện khi sử dụng các phương pháp đó để kiểm tra vô số các thuộc tính và phương pháp khác nhau.

Như một giải pháp cho sự bất tiện này, Python đã giới thiệu một khái niệm được gọi là lớp cơ sở trừu tượng (abc) . Trong phần này, chúng ta sẽ thảo luận về lớp cơ sở trừu tượng và tầm quan trọng của nó.

  • Lớp cơ sở trừu tượng
  • Khai báo lớp cơ sở trừu tượng
  • Tại sao phải khai báo lớp cơ sở trừu tượng?
  • Thuộc tính trừu tượng
  • Các lớp trừu tượng dựng sẵn

Lớp cơ sở trừu tượng

Mục tiêu chính của lớp cơ sở trừu tượng là cung cấp một cách chuẩn hóa để kiểm tra xem một đối tượng tuân theo một đặc điểm kỹ thuật nhất định. Nó cũng có thể ngăn chặn mọi nỗ lực khởi tạo một lớp con không ghi đè một phương thức cụ thể trong lớp cha. Và cuối cùng, bằng cách sử dụng một lớp trừu tượng, một lớp có thể lấy danh tính từ một lớp khác mà không cần bất kỳ kế thừa đối tượng nào.

Khai báo một Lớp cơ sở Tóm tắt

< p> Python có một mô-đun được gọi là abc (lớp cơ sở trừu tượng) cung cấp các công cụ cần thiết để tạo một lớp cơ sở trừu tượng. Trước hết, bạn nên hiểu siêu kính ABCMeta được cung cấp bởi lớp cơ sở trừu tượng. Quy tắc là mọi lớp trừu tượng phải sử dụng siêu kính ABCMeta.

Siêu kính ABCMeta cung cấp một phương thức gọi là phương thức đăng ký có thể được gọi bởi phiên bản của nó. Bằng cách sử dụng phương thức đăng ký này, bất kỳ lớp cơ sở trừu tượng nào cũng có thể trở thành tổ tiên của bất kỳ lớp cụ thể tùy ý nào. Hãy hiểu quá trình này bằng cách xem xét một ví dụ về một lớp cơ sở trừu tượng tự đăng ký làm tổ tiên của dict.

Python3

nhập abc

class AbstractClass (siêu lớp học = abc.ABCMeta):

def abstractfunc ( self ):

return < / code> Không có

print (AbstractClass.register ( dict ))

 
 

Đầu ra:

 & lt; class 'dict' & gt; 

Ở đây, dict tự nhận mình là một lớp con của AbstractClass. Hãy kiểm tra.

Python3

import abc

class AbstractClass (metaclass = abc.ABCMeta):

def abstractfunc ( self ):

return Không có

AbstractClass.register ( dict )

print ( Issubclass ( dict , AbstractClass))

 
 

Đầu ra:

 Đúng 

Tại sao lại khai báo một lớp cơ sở trừu tượng?

Để hiểu được nhu cầu t o khai báo một lớp con ảo, chúng ta cần xem xét ví dụ về một đối tượng giống như danh sách mà bạn không muốn đặt giới hạn là chỉ xem xét danh sách hoặc bộ giá trị. Trước đó, hãy xem cách sử dụng isinstance để kiểm tra danh sách hoặc nhóm lớp.

 isinstance ([], (list, tuple))

Việc kiểm tra này đáp ứng mục đích nếu bạn chỉ chấp nhận một danh sách hoặc bộ giá trị. Nhưng ở đây trường hợp khác, không có hạn chế như vậy. Vì vậy, giải pháp này không thể mở rộng cho một nhà phát triển sử dụng thư viện của bạn để gửi thứ gì đó khác ngoài danh sách hoặc bộ dữ liệu. Ở đây nói lên tầm quan trọng của lớp trừu tượng. Hãy cùng tìm hiểu đoạn mã dưới đây.

Python3

< p>

import abc

class < code class = "trơn"> MySequence (metaclass = abc.ABCMeta):

vượt qua

MySequence.register ( list )

MySequence.register ( tuple )

a = [ 1 , 2 , 3 ]

b = ( 'x' , 'y' , 'z' )

print ( 'Phiên bản danh sách:' , isinstance (a, MySequence))

print ( 'Tuple instance:' , isinstance (b, MySequence))

print ( 'Đối tượng:' , isinstance ( đối tượng (), MySequence))

 
 

Đầu ra:

 Trường hợp danh sách: Đúng
Ví dụ Tuple: Đúng
Cá thể đối tượng: Sai 

Như bạn có thể thấy, khi bạn thực hiện kiểm tra trạng thái, nó trả về true cho cả danh sách và tuple; đối với các đối tượng khác, nó trả về false. Chúng ta hãy xem xét một tình huống trong đó nhà phát triển mong đợi một đối tượng lớp chính nó. Trong trường hợp trên, isinstance sẽ trả về false. Nhưng nó có thể đạt được bằng cách tạo một lớp tùy chỉnh và đăng ký nó với lớp cơ sở trừu tượng.

Ở đây ‘MySequence’ là một lớp trừu tượng trong thư viện. Một nhà phát triển có thể nhập nó và đăng ký một lớp tùy chỉnh. Hãy xem đoạn mã dưới đây.

Python3

nhập abc

< p class = "line number3 index2 alt2">

class MySequence (metaclass = abc.ABCMeta):

vượt qua

class C ustomListLikeObjCls ( object ):

pass

MySequence.register (CustomListLikeObjCls)

print ( Issubclass (CustomListLikeObjCls, MySequence))

 
 

Đầu ra:

 True 

Tại đây, cá thể CustomListLikeObjCls được chuyển tới thư viện bằng cách đăng ký nó với MySequence. Do đó, kiểm tra cá thể trả về True. Ngoài phương pháp trên, bạn cũng có thể sử dụng phương thức đăng ký như một trình trang trí để đăng ký một lớp tùy chỉnh. Hãy xem cách sử dụng register method as a decorator .

Python3

nhập abc

class MySequence (metaclass = abc.ABCMeta ):

pass

@ MySequence . đăng ký

class CustomListLikeObjCls ( object ):

vượt qua

print ( Issubclass (CustomListLikeObjCls, MySequence))

< / p>

 
 

Đầu ra:

 Đúng 

Đăng ký một lớp bằng phương pháp được triển khai ở trên đáp ứng mục đích. Tuy nhiên, bạn phải đăng ký thủ công cho mọi lớp con dự kiến. Làm thế nào về phân lớp tự động dựa trên một phương pháp cụ thể? Một lớp trừu tượng có một khái niệm được gọi là __subclasshook__ để phân lớp các lớp.

Đây là một phương pháp ma thuật đặc biệt do ABCMeta định nghĩa. __Subclasshook__ phải được định nghĩa là một phương thức lớp sử dụng trình trang trí @classmethod. Nó nhận thêm một đối số vị trí khác với lớp và có thể trả về một trong ba giá trị - True, False hoặc NotImplemented. Hãy xem cách triển khai bên dưới.

Python3

< p>

import abc

class AbstractClass (metaclass = abc.ABCMeta):

@ classmethod

< code class = "undefined space"> def __ subclasshook __ ( cls , khác):

print ( 'subclass hook:' , khác)

hookmethod = getattr (other, 'hookmethod' , Không có )

return có thể gọi được (hookmethod)

class SubClass ( object < / code> ):

def hookmethod ( self ):

vượt qua

class NormalClass ( object ):

hookmethod = 'hook'

print ( Issubclass (SubClass, AbstractClass))

print ( Issubclass (NormalClass, AbstractClass))

 
 

Đầu ra:

 móc lớp con: & lt; class '__main __. SubClass' & gt;
ĐÚNG VẬY
hook lớp con: & lt; class '__main __. NormalClass' & gt;
Sai 

Từ cuộc thảo luận trên, bạn đã hiểu cách tự động móc các lớp con. Bây giờ chúng ta sẽ xem xét cách tránh khởi tạo một lớp con không ghi đè một phương thức cụ thể trong lớp cha. Tính năng này có thể đạt được bằng cách sử dụng @ abc.abstractmethod.

@ abc.abstractmethod

@ abc.abstractmethod ngăn chặn mọi nỗ lực khởi tạo một lớp con không ghi đè một phương thức cụ thể trong lớp chồng. Hãy xem đoạn mã dưới đây:

Python3

nhập abc

< p class = "line number3 index2 alt2">

class AbstractClass (metaclass = abc.ABCMeta):

@ abc . abstractmethod

def abstractName ( self ):

pass

class Không hợp lệ (AbstractClass) :

pass

isc = InvalidSubClass ()

 
 

Vì lớp không hợp lệ không ghi đè phương thức abstractName, nên @ abc.abstractmethod ngăn lớp con từ inst antiation và đưa ra lỗi bên dưới.

Traceback (lần gọi gần đây nhất):
Tệp “/home/553d5199a662239eae3ff58efb37b6ec.py”, dòng 11, trong & lt; module & gt;
Isc = InvalidSubClass ()
TypeError: Không thể khởi tạo lớp trừu tượng InvalidSubClass bằng các phương thức trừu tượng abstractName

Hãy xem xét một ví dụ khác trong đó lớp con ghi đè phương thức trừu tượng.

Python3

< / p>

nhập abc

class AbstractClass (siêu lớp học = abc.ABCMeta ): < / p>

@ abc . trừu tượng

def abstractName ( self ):

pass

class ValidSubClass (AbstractClass):

def abstractName ( self ):

return 'Tóm tắt 1'

vc = ValidSubClass ()

print (vc.abstractName ())

 
 

Đầu ra:

 Tóm tắt 1 

Tiếp theo, hãy xem cách khai báo các thuộc tính dưới dạng lớp trừu tượng.

Thuộc tính trừu tượng

Chúng ta có thể sử dụng trình trang trí @property và @ abc.abstractmethod để khai báo thuộc tính như một lớp trừu tượng. Hãy xem đoạn mã dưới đây.

Python3

< p>

import abc

class < code class = "trơn"> AbstractClass (metaclass = abc.ABCMeta):

@ property

@ abc . abstractmethod

def abstractName ( tự ):

vượt qua

class ValidSubClass (AbstractClass ):

@ property

def abstractName (< / code> self ):

return 'Abstract 1'

vc = ValidSubClass ()

< p class = "line number18 index17 alt1"> print (vc.abstractName)

 
 

Đầu ra:

 Abstract 1 

Các lớp trừu tượng dựng sẵn

Thư viện chuẩn Python 3 cung cấp một vài lớp trừu tượng dựng sẵn cho cả phương thức trừu tượng và không trừu tượng. Chúng bao gồm trình tự, trình tự có thể thay đổi, có thể lặp lại, v.v. Nó thường phục vụ như một sự thay thế cho phân lớp con một lớp Python tích hợp sẵn. Ví dụ, phân lớp MutableSequence có thể thay thế lớp con của danh sách hoặc str. Mục đích chính của việc sử dụng lớp Abstract là nó cho phép bạn xem xét một loại tập hợp chung hơn là mã hóa cho từng loại tập hợp. Ở đây chúng ta sẽ thảo luận về ABC theo phương pháp duy nhất và ABC theo phương thức thay thế.

  • ABC theo phương pháp đơn
  • ABC có phương thức thay thế

Các ABC đơn phương thức

Python có năm lớp cơ sở trừu tượng. Chúng như sau:

  • Có thể gọi (__call__)
  • Vùng chứa (__contains__)
  • Có thể truy cập (__hash__)
  • Có thể lặp lại ( __iter__)
  • Sized (__len__)

Mỗi lớp cơ sở trừu tượng này chứa một phương thức trừu tượng. Hãy xem xét một ví dụ về phương thức __len__.

Python3

từ collection.abc nhập Kích thước

< p class = "line number2 index1 alt1">

class SingleMethod ( đối tượng ):

def __ len __ ( self ):

trả về 10

print ( Issubclass (SingleMethod, Sized))

 
 

Đầu ra:

 Đúng 

Bất kỳ lớp nào có phương thức thích hợp được coi là lớp con của lớp cơ sở trừu tượng. Trong số năm lớp cơ sở trừu tượng ở trên, Iterator hơi khác một chút. Nó cung cấp triển khai cho __iter__ và thêm một phương thức trừu tượng được gọi là __next__ .

ABCs Bộ sưu tập thay thế

Các ABCs Bộ sưu tập thay thế là các lớp cơ sở trừu tượng dựng sẵn xác định các lớp con, phục vụ các mục đích tương tự. Chúng có thể được chia thành ba loại. Hãy xem qua từng thứ một.

  • Trình tự và Trình tự có thể thay đổi : Trình tự và Trình tự có thể thay đổi là các lớp cơ sở trừu tượng thường hoạt động giống như các bộ dữ liệu hoặc danh sách. Một lớp cơ sở trừu tượng của trình tự yêu cầu __getitem__ và __len__, trong khi trình tự có thể thay đổi cần __setitem__ __ getitem__ .
  • Ánh xạ : Ánh xạ đi kèm với ánh xạ có thể thay đổi, chủ yếu dành cho các đối tượng giống từ điển
  • Tập hợp : Tập hợp này đi kèm với một tập hợp có thể thay đổi được dành cho các tập hợp không có thứ tự.

Tóm tắt

Mục đích chính của lớp trừu tượng là kiểm tra xem một đối tượng có tuân theo một giao thức cụ thể hay không. Nó là một lớp có giá trị để thử nghiệm các thuộc tính nhất định của một lớp hoặc chính lớp thử nghiệm. Tuy nhiên, có nhiều thứ khác mà lớp trừu tượng không kiểm tra. Một số trong số đó là chữ ký, kiểu trả về, v.v. Một ưu điểm khác là nó cung cấp một cách linh hoạt cho các nhà phát triển để kiểm tra các kiểu tập hợp phổ biến.

My Personal Notes


Xem thêm những thông tin liên quan đến chủ đề lớp cơ sở trong python

Python 17. Kiểu dữ liệu List trong Lập trình Python

  • Tác giả: TITV
  • Ngày đăng: 2021-12-01
  • Đánh giá: 4 ⭐ ( 3207 lượt đánh giá )
  • Khớp với kết quả tìm kiếm: ★ Xem source code, nội dung và các đường link trong video hướng dẫn tại đây LậpTrìnhPython: https://bit.ly/3CoDLtZ
    ★ Ủng hộ phát triển kênh: Momo,ZaloPay,ViettelPay: 0374568701 / STK: 109005606811 Vietinbank – CTK: Le Nhat Tung.
    ★ Khóa học Lập trình Python: bao gồm tất cả nội dung kiến thức cơ bản về Python, Các thuật toán, Lập trình hướng đối tượng Python, Cấu trúc dữ liệu, Xử lý tập tin trong, Lập trình giao diện.
    Khóa học này cung cấp phần lớn kiến thức và kỹ năng về ngôn ngữ lập trình Python và là bước đệm cho các lập trình viên muốn tìm hiểu sâu về Python.
    Khóa học này phù hợp cho các bạn mới bắt đầu học Lập trình Python, hoặc các bạn muốn ôn tập lại kiến thức một cách hệ thống và mạch lạc để chuẩn bị đi làm.
    ★ Bạn cũng có thể tìm thấy các khóa học về ngôn ngữ khác tại đây: https://www.youtube.com/c/TITVvn
    ★ Cácn bạn vui lòng đăng ký kênh (Subscribe) và chia sẻ video (Share) đến các bạn cùng lớp nhé.
    ★ Diễn đàn hỏi đáp: https://www.facebook.com/groups/titv.vn
    ★ Facebook: https://www.facebook.com/tung.lenhat
    ★ Website: http://titv.vn, http://titv.edu.vn
    =================================
    ✩ Hộp thư đóng góp ý kiến hoặc ý tưởng: lenhattung@gmail.com
    =================================
    © Bản quyền thuộc về TITV ☞ Vui lòng không đăng tải lại Video từ kênh này
    © Copyright by TITV Channel ☞ Do not Re-up

Lớp và đối tượng trong Python

  • Tác giả: openplanning.net
  • Đánh giá: 5 ⭐ ( 4876 lượt đánh giá )
  • Khớp với kết quả tìm kiếm:

Lớp trong Python

  • Tác giả: viblo.asia
  • Đánh giá: 5 ⭐ ( 5303 lượt đánh giá )
  • Khớp với kết quả tìm kiếm: Hôm ni, mình học tiếp về bạn “Lớp(class) trong python”, bài blog tiếp theo nằm trong series “Khám phá Đại Bản Doanh Python”(nội dung trong bài series này từ chủ yếu mình lấy từ python.org rồi viết lại...

Các lớp cơ sở ngoại lệ trong Python

  • Tác giả: vn.wsxdn.com
  • Đánh giá: 3 ⭐ ( 7917 lượt đánh giá )
  • Khớp với kết quả tìm kiếm:

[Tự học Python] Bài tập với Cơ sở dữ liệu trong python

  • Tác giả: cafedev.vn
  • Đánh giá: 5 ⭐ ( 3321 lượt đánh giá )
  • Khớp với kết quả tìm kiếm: Trong bài này chúng ta sẽ tập trung vào các bài tập python liên quan tới Cơ sở dữ liệu trong python...

CLASS VÀ OBJECT TRONG PYTHON - Online Courses - Anytime, Anywhere

  • Tác giả: mifago.com
  • Đánh giá: 4 ⭐ ( 9298 lượt đánh giá )
  • Khớp với kết quả tìm kiếm:

Khóa Học Lập Trình Python Cơ Bản Đến Chuyên Sâu

  • Tác giả: aptechsaigon.edu.vn
  • Đánh giá: 3 ⭐ ( 6255 lượt đánh giá )
  • Khớp với kết quả tìm kiếm: Khóa học lập trình Python cho người mới bắt đầu đến chuyên sâu. Học 100% thực chiến với đồ án của doanh nghiệp giúp phát triển tư duy sáng tạo nghề nghiệp

Xem thêm các bài viết khác thuộc chuyên mục: Kiến thức lập trình

Xem Thêm  Tailwind CSS Cards - Flowbite - thẻ ul

By ads_php