Điểm chính của OOP trong Python là gì?

Lập trình hướng đối tượng [OOP] là một mẫu lập trình dựa trên khái niệm đối tượng. Đối tượng bao gồm dữ liệu và phương thức. Dữ liệu của đối tượng là các thuộc tính của nó, xác định nó là gì. Và các phương thức của đối tượng, đó là các hàm, xác định những gì đối tượng có thể làm. Phong cách lập trình hướng đối tượng rất phổ biến vì khả năng ánh xạ các thực thể trong thế giới ảo của nó. e. mã của chúng tôi, với các đối tượng trong thế giới thực. Các khái niệm OOPS được sử dụng rộng rãi bởi nhiều ngôn ngữ lập trình phổ biến do một số lợi thế mà nó mang lại

Trong bài viết này chúng ta sẽ tìm hiểu về các khái niệm OOPS trong lập trình python

Phạm vi của Điều khoản

Trong bài viết này, bạn sẽ tìm hiểu các khái niệm sau

  1. Khái niệm OOPS trong python
  2. Sự khác biệt chính giữa lập trình hướng đối tượng và thủ tục
  3. Chi tiết và các ví dụ liên quan về Class, Objects và Instance Method trong Python
  4. Các khối xây dựng [cơ bản] của OOPS trong Python như Đa hình, đóng gói, kế thừa và Trừu tượng hóa dữ liệu

Tổng thể bài viết sẽ đáp ứng phạm vi chúng tôi đã đề cập ở trên và xử lý tất cả các khái niệm OOPS trong python

Giới thiệu về Python OOPS

Các khái niệm OOPS trong python có liên quan rất chặt chẽ với thế giới thực của chúng ta, nơi chúng ta viết các chương trình để giải quyết các vấn đề của mình. Giải quyết mọi vấn đề bằng cách tạo các đối tượng là cách tiếp cận phổ biến nhất trong lập trình

Cách tiếp cận này được gọi là Lập trình hướng đối tượng. Lập trình hướng đối tượng ánh xạ các hướng dẫn mã của chúng tôi với các vấn đề trong thế giới thực, giúp viết dễ dàng hơn và dễ hiểu hơn. Chúng ánh xạ các thực thể trong thế giới thực [chẳng hạn như công ty và nhân viên] dưới dạng 'đối tượng phần mềm' có một số 'dữ liệu' được liên kết với chúng và có thể thực hiện một số 'chức năng'

OOPS trong Python là gì?

OOPS trong lập trình là viết tắt của Hệ thống lập trình hướng đối tượng. Đó là một mô hình hoặc phương pháp lập trình, để thiết kế một chương trình sử dụng các lớp và đối tượng OOPS coi mọi thực thể là một đối tượng

Lập trình hướng đối tượng trong Python tập trung vào các đối tượng. Bất kỳ mã nào được viết bằng OOPS là để giải quyết vấn đề của chúng tôi, nhưng được thể hiện dưới dạng Đối tượng. Chúng ta có thể tạo bao nhiêu đối tượng tùy ý, cho một lớp nhất định

Vậy đối tượng là gì? . Các thuộc tính của các đối tượng thường được gọi là các biến của đối tượng và các hành vi được gọi là các chức năng của các đối tượng. Các đối tượng có thể là đời thực hoặc logic

Giả sử, Bút là một đối tượng trong đời thực. Tài sản của một cây bút bao gồm. đó là màu sắc, loại [bút gel hoặc bút bi]. Và, hành vi của cây bút có thể bao gồm điều đó, nó có thể viết, vẽ, v.v.

Bất kỳ tệp nào trong hệ thống của bạn là một ví dụ về đối tượng logic. Các tệp có các thuộc tính như tên tệp, tệp_vị trí, kích thước tệp và các hành vi của chúng bao gồm chúng có thể chứa dữ liệu, có thể tải xuống, chia sẻ, v.v.

Một số lợi ích chính của OOPS bao gồm

  1. Chúng làm giảm sự dư thừa của mã bằng cách viết mã rõ ràng và có thể sử dụng lại [sử dụng tính kế thừa]
  2. Chúng dễ hình dung hơn vì chúng hoàn toàn liên quan đến các tình huống trong thế giới thực. Ví dụ, khái niệm về đối tượng, thừa kế, trừu tượng, liên quan rất chặt chẽ đến các tình huống trong thế giới thực [chúng ta sẽ thảo luận thêm về chúng trong bài viết này]
  3. Mỗi đối tượng trong oops đại diện cho một phần khác nhau của mã và có logic cũng như dữ liệu riêng để giao tiếp với nhau. Vì vậy, không có sự phức tạp trong mã

Sự khác biệt giữa lập trình hướng đối tượng và hướng thủ tục

Bạn có biết Python tuân theo 4 loại mô hình lập trình?

Chúng bao gồm. lập trình mệnh lệnh, chức năng, thủ tục và hướng đối tượng

Ở đây chúng ta sẽ thấy sự khác biệt giữa 2 trong số các mô hình lập trình quan trọng nhất trong Python. Lập trình hướng thủ tục [POP] & Lập trình hướng đối tượng [OOP]. Hãy bắt đầu nào

1. Họ là ai?

Chúng ta hãy xem cách tiếp cận được sử dụng bởi mỗi khung mẫu -

NHẠC POP. Giả sử bạn muốn nấu maggie. Sau đó, bạn đi qua một danh sách các bước như --

  • Đun sôi một ít nước trong chảo
  • Thêm maggie vào nó
  • Thêm maggi masala
  • Nấu ăn và phục vụ

Tương tự như vậy, POP yêu cầu một quy trình các bước nhất định để vận hành. POP bao gồm các chức năng. Một chương trình POP được chia thành các chức năng, mỗi chức năng dành riêng cho một nhiệm vụ cụ thể. Các chức năng được sắp xếp theo thứ tự cụ thể và luồng điều khiển chương trình diễn ra tuần tự

OOP. OOP bao gồm các đối tượng. Họ chia chương trình thành các đối tượng. Các đối tượng này là các thực thể kết hợp các thuộc tính và phương thức của các đối tượng trong thế giới thực

2. Họ ưa thích ở đâu?

POP chỉ phù hợp với các tác vụ nhỏ. Bởi vì, độ phức tạp của mã tăng lên khi độ dài của chương trình tăng lên và cuối cùng nó chứa đầy các chức năng. Nó trở nên khó khăn hơn để gỡ lỗi

OOP phù hợp với các vấn đề lớn hơn. Họ có thể làm cho mã có thể tái sử dụng bằng cách sử dụng đệ quy, giúp mã sạch hơn và ít phức tạp hơn

3. Cái nào cung cấp bảo mật hơn?

POP kém an toàn hơn vì nó cung cấp các chức năng với tất cả dữ liệu. Vì vậy, dữ liệu của chúng tôi không bị ẩn. POP không phải là một tùy chọn được đề xuất nếu bạn muốn bảo mật thông tin đăng nhập của mình hoặc bất kỳ thông tin cá nhân nào

OOP an toàn hơn vì nó cung cấp cho bạn khả năng bảo mật thông qua việc ẩn dữ liệu. OOP có một khái niệm đặc biệt được gọi là "Đóng gói", cho phép nó có đặc tính ẩn dữ liệu [chúng ta sẽ đọc thêm về điều này]

4. Phương pháp lập trình

POP tuân theo cách tiếp cận lập trình từ trên xuống. Cách tiếp cận lập trình từ trên xuống, tập trung vào việc chia nhỏ một vấn đề lớn thành các đoạn mã nhỏ hơn và dễ hiểu. Sau đó, nó giải quyết những vấn đề nhỏ hơn đó

Các khái niệm OOPS, tuân theo cách tiếp cận lập trình từ dưới lên. Cách tiếp cận từ dưới lên trước tiên tập trung vào việc giải quyết các vấn đề nhỏ hơn ở cấp độ rất cơ bản, sau đó tích hợp chúng thành một giải pháp tổng thể và hoàn chỉnh

5. Sử dụng công cụ sửa đổi truy cập

Access specifiers hoặc Access modifiers trong python được sử dụng để giới hạn quyền truy cập của các biến lớp và phương thức lớp bên ngoài lớp trong khi triển khai các khái niệm kế thừa. Điều này có thể đạt được bằng cách. Từ khóa công khai, riêng tư và được bảo vệ

POP không sử dụng các công cụ sửa đổi quyền truy cập như 'công khai', riêng tư' hoặc được bảo vệ'. POP không có khái niệm kế thừa hoặc lớp để sử dụng các công cụ sửa đổi trên. OOP hỗ trợ các công cụ sửa đổi truy cập. Họ đã có khái niệm kế thừa và do đó, họ có thể sử dụng các từ bổ nghĩa như 'công khai', riêng tư' hoặc được bảo vệ'

Ghi chú

Công cụ sửa đổi truy cập của Python cực kỳ hữu ích khi sử dụng các khái niệm kế thừa. Khái niệm này cũng có thể được áp dụng cho các phương thức của lớp

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

Giả sử bạn muốn lưu trữ số lượng sách bạn có, bạn chỉ cần làm điều đó bằng cách sử dụng một biến. Hoặc, giả sử bạn muốn tính tổng của 5 số và lưu trữ nó trong một biến, điều đó cũng có thể được thực hiện

Các cấu trúc dữ liệu nguyên thủy như số, chuỗi và danh sách được thiết kế để lưu trữ các giá trị đơn giản trong một biến. Giả sử, tên của bạn, hoặc bình phương của một số, hoặc đếm một số viên bi [giả sử]

Nhưng nếu bạn cần lưu trữ thông tin chi tiết của tất cả Nhân viên trong công ty của mình thì sao? . g. đó là trường tên hoặc empID, v.v. ]

Ví dụ

employee1 = ['John Smith', 104120, "Developer", "Dept. 2A"]
employee2 = ['Mark Reeves', 211240, "Database Designer", "Dept. 11B"]
employee3 = ['Steward Jobs', 131124, "Manager", "Dept. 2A"]

Ngay cả khi bạn cố gắng lưu trữ chúng trong từ điển, thì sau một thời gian, toàn bộ cơ sở mã sẽ quá phức tạp để xử lý. Vì vậy, trong những trường hợp này, chúng tôi sử dụng Lớp học trong python

Một lớp được sử dụng để tạo cấu trúc dữ liệu do người dùng định nghĩa trong Python. Các lớp định nghĩa các hàm, được gọi là các phương thức, mô tả các hành vi và hành động mà một đối tượng được tạo từ một lớp có thể thực hiện. Các khái niệm OOPS trong python chủ yếu xử lý các lớp và đối tượng

Các lớp làm cho mã dễ quản lý hơn bằng cách tránh các cơ sở mã phức tạp. Nó làm như vậy, bằng cách tạo ra một kế hoạch chi tiết hoặc một thiết kế về cách mọi thứ nên được xác định. Nó định nghĩa những thuộc tính hoặc chức năng nào, bất kỳ đối tượng nào được dẫn xuất từ ​​lớp nên có

QUAN TRỌNG

Một lớp chỉ xác định cấu trúc của mọi thứ sẽ trông như thế nào. Nó không trỏ đến bất cứ điều gì hoặc bất cứ ai cụ thể. Ví dụ: giả sử, CON NGƯỜI là một lớp, có giả sử -- tên, tuổi, giới tính, thành phố. Nó không trỏ đến bất kỳ CON NGƯỜI cụ thể nào ngoài đó, nhưng vâng, nó giải thích các thuộc tính và chức năng mà bất kỳ CON NGƯỜI nào nên có hoặc bất kỳ đối tượng nào của lớp CON NGƯỜI nên có

Một thể hiện của một lớp được gọi là đối tượng. Nó là sự triển khai của lớp và tồn tại trong thực tế

Một đối tượng là một tập hợp dữ liệu [biến] và phương thức [hàm] truy cập dữ liệu. Đó là việc thực hiện thực sự của một lớp

Hãy xem xét ví dụ này, ở đây Con người là một lớp - Nó chỉ là một bản thiết kế xác định con người nên như thế nào và không phải là một triển khai thực sự. Bạn có thể nói rằng lớp "Con người" chỉ tồn tại một cách hợp lý

Tuy nhiên, "Ron" là một đối tượng của lớp Human [vui lòng tham khảo hình ảnh đưa ra ở trên để hiểu]. Điều đó có nghĩa là, Ron được tạo ra bằng cách sử dụng bản thiết kế của lớp Người và nó chứa dữ liệu thực. "Ron" tồn tại về mặt vật lý, không giống như "Con người" [chỉ tồn tại về mặt logic]. Anh ta tồn tại trong thực tế và thực hiện tất cả các thuộc tính của lớp Con người, chẳng hạn như Ron có tên, anh ta 15 tuổi, anh ta là nam và sống ở Delhi. Ngoài ra, Ron implement tất cả các phương thức của class Human, giả sử Ron có thể đi, nói, ăn và ngủ

Và nhiều người có thể được tạo ra bằng cách sử dụng bản thiết kế của lớp Human. Chẳng hạn, chúng ta có thể tạo thêm hàng nghìn người bằng cách tham khảo bản thiết kế của lớp Người, sử dụng các đối tượng

Mẹo nhanh

class = blueprint [giả sử một bản vẽ kiến ​​trúc]. Đối tượng là một thứ thực tế được xây dựng dựa trên 'bản thiết kế' [giả sử là một ngôi nhà]. Một thể hiện là một bản sao ảo [nhưng không phải là bản sao thực] của đối tượng

Khi một lớp được định nghĩa, chỉ bản thiết kế của đối tượng được tạo và không có bộ nhớ nào được cấp phát cho lớp. Cấp phát bộ nhớ chỉ xảy ra khi đối tượng hoặc thể hiện được tạo. Đối tượng hoặc thể hiện chứa dữ liệu hoặc thông tin thực

Làm cách nào để xác định một lớp trong Python?

Các lớp trong Python có thể được định nghĩa bởi từ khóa lớp, theo sau là tên của lớp và dấu hai chấm

cú pháp

Mã thụt vào bên dưới định nghĩa lớp được coi là một phần của nội dung lớp

'vượt qua' thường được sử dụng làm trình giữ chỗ, ở vị trí mã mà việc triển khai mã mà chúng tôi có thể bỏ qua trong thời gian này. "pass" cho phép chúng tôi chạy mã mà không gây ra lỗi trong Python

Phương thức __init__ là gì?

Các thuộc tính mà tất cả các đối tượng Human phải có, được định nghĩa trong một phương thức gọi là init[]. Mỗi khi một đối tượng Human mới được tạo, __init__[] thiết lập trạng thái ban đầu của đối tượng bằng cách gán các giá trị mà chúng tôi cung cấp bên trong các thuộc tính của đối tượng. Nghĩa là, __init__[] khởi tạo từng thể hiện mới của lớp. __init__[] có thể nhận bất kỳ số lượng tham số nào, nhưng tham số đầu tiên luôn là một biến có tên là self

Tham số self là một tham chiếu đến thể hiện hiện tại của lớp. Nó có nghĩa là, tham số self trỏ đến địa chỉ của đối tượng hiện tại của một lớp, cho phép chúng ta truy cập dữ liệu của các biến [của đối tượng] của nó

Vì vậy, ngay cả khi chúng ta có 1000 thể hiện [đối tượng] của một lớp, chúng ta luôn có thể lấy từng dữ liệu riêng lẻ của chúng do chính cái này, bởi vì nó sẽ trỏ đến địa chỉ của đối tượng cụ thể đó và trả về giá trị tương ứng

Ghi chú

Chúng ta có thể sử dụng bất kỳ tên nào thay cho self, nhưng nó phải là tham số đầu tiên của bất kỳ hàm nào trong lớp

Hãy để chúng tôi xem cách định nghĩa __init__[] trong lớp Human

Mã số

class Human:
    def __init__[self, name, age, gender]:
        self.name = name
        self.age = age
        self.gender = gender

Trong cơ thể của. __init__[], chúng tôi đang sử dụng biến self 3 lần, cho các trường hợp sau

bản thân. name = 'name' tạo một thuộc tính có tên là name và gán cho nó giá trị của tham số name

bản thân. age = thuộc tính age được tạo và gán cho giá trị của tham số age được truyền vào

bản thân. giới tính = thuộc tính giới tính được tạo và gán cho giá trị của tham số giới tính được truyền

Có 2 loại thuộc tính trong Python

1. Thuộc tính lớp

Đây là những biến giống nhau cho tất cả các phiên bản của lớp. Chúng không có giá trị mới cho mỗi phiên bản mới được tạo. Chúng được định nghĩa ngay bên dưới định nghĩa lớp

Mã số

class Human:
    #class attribute
    species = "Homo Sapiens"

Ở đây, các loài sẽ có một giá trị cố định cho bất kỳ đối tượng nào chúng ta tạo ra

2. Thuộc tính sơ thẩm

Thuộc tính sơ thẩm là các biến được định nghĩa bên trong bất kỳ hàm nào trong lớp. Thuộc tính thể hiện có các giá trị khác nhau cho mọi thể hiện của lớp. Các giá trị này phụ thuộc vào giá trị mà chúng ta truyền vào khi tạo thể hiện

Mã số

class Human:
    #class attribute
    species = "Homo Sapiens"
    def __init__[self, name, age, gender]:
        self.name = name
        self.age = age
        self.gender = gender

Ở đây, tên, tuổi và giới tính là các thuộc tính thể hiện. Chúng sẽ có các giá trị khác nhau đối với các phiên bản mới của lớp

Đối với các thuộc tính phải có giá trị tương tự cho mỗi phiên bản của một lớp, hãy sử dụng các thuộc tính của lớp. Đối với các thuộc tính khác nhau trên mỗi phiên bản, hãy sử dụng các thuộc tính của phiên bản

Tạo một đối tượng trong lớp

Khi chúng ta tạo một đối tượng mới từ một lớp, nó được gọi là khởi tạo một đối tượng. Một đối tượng có thể được khởi tạo bằng tên lớp theo sau bởi dấu ngoặc đơn. Chúng ta có thể gán đối tượng của một lớp cho bất kỳ biến nào

cú pháp

Ngay khi một đối tượng được khởi tạo, bộ nhớ được cấp phát cho chúng. Vì vậy, nếu chúng ta so sánh 2 phiên bản của cùng một lớp bằng cách sử dụng '==', nó sẽ trả về false [vì cả hai sẽ được gán bộ nhớ khác nhau]

Giả sử, chúng ta cố gắng tạo các đối tượng của lớp Human, sau đó chúng ta cũng cần truyền các giá trị cho tên, tuổi và giới tính

Mã số

class Human:
    #class attribute
    species = "Homo Sapiens"
    def __init__[self, name, age, gender]:
        self.name = name
        self.age = age
        self.gender = gender
        
x = Human["Ron", 15, "Male"] 
y = Human["Miley", 22, "Female"]

Ở đây, chúng ta đã tạo 2 đối tượng của lớp Human truyền tất cả các đối số cần thiết

Cảnh báo. Nếu chúng ta không vượt qua các đối số được yêu cầu, nó sẽ ném TypeError. LoạiLỗi. init[] thiếu 3 đối số vị trí bắt buộc. 'tên', 'tuổi' và 'giới tính'

Bây giờ chúng ta hãy xem cách truy cập các giá trị đó bằng các đối tượng của lớp. Chúng ta có thể truy cập các giá trị của các thể hiện bằng cách sử dụng ký hiệu dấu chấm

Mã số

class Human:
    #class attribute
    species = "Homo Sapiens"
    def __init__[self, name, age, gender]:
        self.name = name
        self.age = age
        self.gender = gender
        
x = Human["Ron", 15, "Male"] 
y = Human["Miley", 22, "Female"]
print[x.name]
print[y.name]

đầu ra

Vì vậy, chúng tôi thấy rằng chúng tôi có thể truy cập các thuộc tính lớp và thể hiện chỉ bằng cách sử dụng toán tử dấu chấm

Mã số

class Human:
    species = "Homo Sapiens"

    def __init__[self, name, age, gender]:
        self.name = name
        self.age = age
        self.gender = gender


# x and y are instances of class Human
x = Human["Ron", 15, "male"]
y = Human["Miley", 22, "female"]

print[x.species]  # species are class attributes, hence will have same value for all instances
print[y.species]

# name, gender and age will have different values per instance, because they are instance attributes
print[f"Hi! My name is {x.name}. I am a {x.gender}, and I am {x.age} years old"]
print[f"Hi! My name is {y.name}. I am a {y.gender}, and I am {y.age} years old"]

đầu ra

Homo Sapiens
Homo Sapiens
Hi! My name is Ron. I am a male, and I am 15 years old
Hi! My name is Miley. I am a female, and I am 22 years old

Trong ví dụ trên, chúng ta có các giá trị thuộc tính lớp giống "Homo Sapiens", nhưng các giá trị thuộc tính thể hiện khác nhau tùy theo giá trị chúng ta đã truyền khi tạo đối tượng

Tuy nhiên, chúng ta có thể thay đổi giá trị của các thuộc tính lớp, bằng cách gán tên lớp. classAttribute với bất kỳ giá trị mới nào

Mã số

________số 8

đầu ra

Phương thức sơ thẩm

Một phương thức thể hiện là một hàm được định nghĩa trong một lớp chỉ có thể được gọi từ các thể hiện của lớp đó. Giống như init[], tham số đầu tiên của phương thức cá thể luôn luôn tự

Hãy lấy một ví dụ và triển khai một số chức năng mà lớp Human có thể thực hiện --

Mã số

class Human:
    #class attribute
    species = "Homo Sapiens"
    def __init__[self, name, age, gender]:
        self.name = name
        self.age = age
        self.gender = gender
        
    #Instance Method
    def speak[self]:
        return f"Hello everyone! I am {self.name}"
    
    #Instance Method
    def eat[self, favouriteDish]:
        return f"I love to eat {favouriteDish}!!!"

x = Human["Ciri",18,"female"]
print[x.speak[]]
print[x.eat["momos"]]

đầu ra

class Human:
    def __init__[self, name, age, gender]:
        self.name = name
        self.age = age
        self.gender = gender
0

Lớp Human này có hai phương thức thể hiện

  1. nói chuyện[]. Nó trả về một chuỗi hiển thị tên của Human
  2. ăn[]. Nó có một tham số "favouriteDish" và trả về một chuỗi hiển thị món ăn yêu thích của Con người

Khi đã có được kiến ​​thức thấu đáo về các lớp, đối tượng và phương thức Python là gì, đã đến lúc chúng ta tập trung vào các nguyên tắc cốt lõi của OOP, dựa trên đó nó được xây dựng

Nguyên tắc cơ bản của OOPS trong Python

Có bốn khái niệm cơ bản về lập trình hướng đối tượng –

  1. Di sản
  2. đóng gói
  3. đa hình
  4. Trừu tượng dữ liệu

Bây giờ chúng ta hãy xem xét sâu từng khái niệm OOPS trong python

Di sản

Mọi người thường nói với những đứa trẻ mới sinh rằng chúng có nét mặt giống bố mẹ hoặc chúng được thừa hưởng một số nét mặt từ bố mẹ. Có khả năng là bạn cũng đã nhận thấy rằng bạn đã thừa hưởng một số hoặc các tính năng khác từ cha mẹ của bạn

Kế thừa cũng rất giống với kịch bản đời thực. Nhưng ở đây, "các lớp con" kế thừa các tính năng từ "các lớp cha" của chúng. " Và các tính năng mà chúng kế thừa ở đây được gọi là "thuộc tính" và "phương thức"

Kế thừa là quá trình mà một lớp có thể kế thừa hoặc dẫn xuất các thuộc tính [hoặc dữ liệu] và phương thức [hoặc hàm] của một lớp khác. Đơn giản, quá trình kế thừa các thuộc tính của lớp cha vào lớp con được gọi là kế thừa

Lớp có các thuộc tính được kế thừa là lớp Cha và lớp kế thừa các thuộc tính của lớp Cha là lớp Con

Hãy cho chúng tôi xem cú pháp kế thừa trong Python

Mã số

class Human:
    def __init__[self, name, age, gender]:
        self.name = name
        self.age = age
        self.gender = gender
1

Vì vậy, chúng tôi định nghĩa một lớp bình thường như chúng tôi đã xác định trong các ví dụ trước của chúng tôi. Sau đó, chúng ta có thể định nghĩa lớp con và đề cập đến tên lớp cha mà nó kế thừa trong ngoặc đơn

Mã số

class Human:
    def __init__[self, name, age, gender]:
        self.name = name
        self.age = age
        self.gender = gender
2

đầu ra

class Human:
    def __init__[self, name, age, gender]:
        self.name = name
        self.age = age
        self.gender = gender
3

Trong ví dụ trên, lớp con Boy đang kế thừa lớp cha Human. Vì vậy, khi chúng ta tạo một đối tượng của lớp Boy, chúng ta có thể truy cập tất cả các phương thức và thuộc tính của lớp cha của nó, Human, bởi vì nó đang kế thừa nó

Ngoài ra, chúng ta đã định nghĩa một phương thức trong lớp Boy, đó là tên trường. Phương thức tên trường không thể được truy cập bởi đối tượng lớp cha. Nhưng rõ ràng chúng ta có thể gọi phương thức schoolName bằng cách tạo đối tượng lớp con[Boy]

Hãy xem vấn đề chúng ta gặp phải nếu chúng ta đang cố gọi các phương thức của lớp con bằng cách sử dụng đối tượng của lớp cha

Mã số

class Human:
    def __init__[self, name, age, gender]:
        self.name = name
        self.age = age
        self.gender = gender
4

đầu ra

class Human:
    def __init__[self, name, age, gender]:
        self.name = name
        self.age = age
        self.gender = gender
5

Vì vậy, ở đây chúng tôi nhận được AttributeError. Đối tượng 'con người' không có thuộc tính 'schoolName'. Bởi vì, các lớp con có thể truy cập dữ liệu và thuộc tính của lớp cha nhưng ngược lại thì không thể

Siêu[]

Hàm super[] là một hàm liên quan đến thừa kế tham chiếu đến lớp cha. Chúng ta có thể sử dụng nó để tìm phương thức có tên cụ thể trong lớp cha của đối tượng. Đó là một chức năng rất hữu ích. Hãy để chúng tôi xem nó hoạt động như thế nào --

cú pháp. Đây là cú pháp của siêu chức năng. Chúng tôi viết từ khóa super[] theo sau là tên phương thức mà chúng tôi muốn tham chiếu từ lớp cha của chúng tôi

Mã số

class Human:
    def __init__[self, name, age, gender]:
        self.name = name
        self.age = age
        self.gender = gender
6

đầu ra

class Human:
    def __init__[self, name, age, gender]:
        self.name = name
        self.age = age
        self.gender = gender
7

Ở đây, chúng ta đã định nghĩa phương thức dance[] trong lớp Human và Girl. Tuy nhiên, cả hai phương pháp đều có cách triển khai khác nhau như bạn có thể thấy. Trong lớp Người, phương pháp khiêu vũ nói "Tôi có thể nhảy", trong khi ở lớp Nữ, phương pháp khiêu vũ nói "Tôi có thể nhảy cổ điển". Vì vậy, chúng ta hãy gọi phương thức nhảy của lớp cha từ lớp con

Bạn có thể thấy, ở dòng 19, chúng ta đang gọi phương thức nhảy bằng cách sử dụng super[]. nhảy[]. Điều này sẽ gọi phương thức khiêu vũ từ lớp Người. Vì vậy, nó in "Tôi có thể nhảy". Mặc dù vậy, đã có một triển khai cho dance[] trong Girl[ở dòng 15]

Khi chúng ta gọi bất kỳ phương thức nào bằng super[], phương thức trong lớp cha sẽ được gọi ngay cả khi có phương thức trùng tên trong lớp con

đa hình

Giả sử, bạn đang cuộn qua các nguồn cấp dữ liệu Instagram trên điện thoại của mình. Bạn đột nhiên cảm thấy muốn nghe một số bản nhạc, vì vậy bạn đã mở Spotify và bắt đầu phát bài hát yêu thích của mình. Sau đó, sau một thời gian, bạn nhận được một cuộc gọi, vì vậy bạn đã tạm dừng tất cả các hoạt động nền đang thực hiện để trả lời cuộc gọi đó. Đó là cuộc gọi của bạn bạn, yêu cầu bạn nhắn tin vào số điện thoại của một người nào đó. Vì vậy, bạn đã nhắn tin cho anh ấy số điện thoại và tiếp tục các hoạt động của mình

Bạn có nhận thấy một điều? . Ái chà

Vì vậy, Đa hình là một cái gì đó tương tự như vậy. 'Poly' có nghĩa là nhiều và 'morph' có nghĩa là các hình thức. Vì vậy, đa hình hoàn toàn có nghĩa là một cái gì đó có nhiều hình thức. Hoặc, 'thứ gì đó' có thể có nhiều hành vi tùy thuộc vào tình huống

Tính đa hình trong OOPS đề cập đến các chức năng có cùng tên nhưng mang các chức năng khác nhau. Hoặc, có cùng tên hàm, nhưng chữ ký hàm khác nhau [các tham số được truyền cho hàm]

Một lớp con kế thừa tất cả các thuộc tính từ các phương thức của lớp cha. Nhưng đôi khi, nó muốn thêm phần triển khai của chính nó vào các phương thức. Có rất nhiều cách chúng ta có thể sử dụng tính đa hình trong Python

Ví dụ về các hàm đa hình sẵn có

len[] là một ví dụ về chức năng đa hình sẵn có. Bởi vì, chúng ta có thể sử dụng nó để tính toán độ dài của nhiều loại khác nhau như chuỗi, danh sách, tuple hoặc từ điển, nó sẽ chỉ tính toán kết quả và trả về

Mã số

class Human:
    def __init__[self, name, age, gender]:
        self.name = name
        self.age = age
        self.gender = gender
8

đầu ra

Ở đây chúng tôi đã chuyển một chuỗi, danh sách và từ điển cho hàm len và nó đã tính toán kết quả. Vì vậy, đây là ví dụ về hàm Đa hình sẵn có

Chúng tôi cũng có tính đa hình với toán tử bổ sung '+'. Chúng ta có thể sử dụng nó để 'thêm' số nguyên hoặc số float hoặc bất kỳ phép toán cộng số học nào. Mặt khác, với String, nó thực hiện thao tác 'nối'

Mã số

class Human:
    def __init__[self, name, age, gender]:
        self.name = name
        self.age = age
        self.gender = gender
9

đầu ra

Vì vậy, chúng ta có thể thấy rằng một toán tử '+' đã được sử dụng để thực hiện các thao tác khác nhau cho các loại dữ liệu riêng biệt

Đa hình với các phương thức lớp

Chúng ta có thể thực hiện đa hình với các phương thức của lớp. Hãy xem làm thế nào

Mã số

class Human:
    #class attribute
    species = "Homo Sapiens"
0

đầu ra

class Human:
    #class attribute
    species = "Homo Sapiens"
1

Ở đây, chúng ta có thể lặp lại các đối tượng của Monkey & Rabbit bằng cách sử dụng một biến - động vật và nó có thể gọi các phương thức thể hiện của cả hai. Vì vậy, ở đây một động vật biến đổi được sử dụng để thể hiện hành vi [màu[] & ăn[]] của Khỉ cũng như Thỏ. Vì vậy, nó tuân theo các quy tắc của Đa hình

Đa hình với kế thừa

Chúng ta cũng có thể có tính đa hình với tính kế thừa. Có thể sửa đổi một phương thức trong lớp con mà nó đã kế thừa từ lớp cha, thêm phần triển khai của chính nó vào phương thức. Quá trình triển khai lại một phương thức trong lớp con này được gọi là Ghi đè phương thức trong Python. Đây là một ví dụ cho thấy tính đa hình với tính kế thừa

Mã số

class Human:
    #class attribute
    species = "Homo Sapiens"
2

đầu ra

class Human:
    #class attribute
    species = "Homo Sapiens"
3

Ở đây, lớp Square và Triangle đã ghi đè phương thức của lớp shape. Vì vậy, ở đây, phương thức no_of_sides có các cách triển khai khác nhau đối với các hình dạng khác nhau. Vì vậy, nó phù hợp với Đa hình

đóng gói

Chắc hẳn bạn đã từng nhìn thấy những viên nang thuốc, trong đó tất cả các loại thuốc vẫn được đặt bên trong nắp của viên nang. Về cơ bản, viên nang đóng gói một số kết hợp thuốc

Tương tự như vậy trong lập trình, các biến và phương thức vẫn được đặt bên trong một viên nang gọi là 'lớp'. Vâng, chúng tôi đã học rất nhiều về các lớp trong Python và chúng tôi đã biết rằng, tất cả các biến và hàm chúng tôi tạo trong OOP vẫn nằm trong lớp

Quá trình liên kết dữ liệu và các phương thức [hành vi] tương ứng với nhau thành một đơn vị duy nhất được gọi là đóng gói trong Python

Nói cách khác, đóng gói là một kỹ thuật lập trình liên kết các thành viên của lớp [các biến và phương thức] lại với nhau và ngăn không cho các lớp khác truy cập chúng. Đây là một trong những khái niệm về OOPS trong Python

Đóng gói là một cách để đảm bảo an ninh. Nó ẩn dữ liệu khỏi sự truy cập của người ngoài. Một tổ chức có thể bảo vệ đối tượng/thông tin của mình trước sự truy cập không mong muốn của khách hàng hoặc bất kỳ người nào không được ủy quyền bằng cách đóng gói nó

Getters và setters

Chúng tôi chủ yếu sử dụng đóng gói để ẩn dữ liệu. Chúng tôi làm như vậy bằng cách định nghĩa các phương thức getter và setter cho các lớp của chúng tôi. Nếu bất cứ ai muốn một số dữ liệu, họ chỉ có thể lấy nó bằng cách gọi phương thức getter. Và, nếu họ muốn đặt một số giá trị cho dữ liệu, họ phải sử dụng phương thức setter cho điều đó, nếu không họ sẽ không thể làm như vậy. Nhưng bên trong, cách thức hoạt động của các phương thức getter và setter này vẫn bị ẩn khỏi thế giới bên ngoài

Mã của getter và setter trong Encapsulation

class Human:
    #class attribute
    species = "Homo Sapiens"
4

đầu ra

class Human:
    #class attribute
    species = "Homo Sapiens"
5

Trong ví dụ trên, chúng tôi đã định nghĩa getter getBookName[] và setter setBookName[] để lấy và đặt tên sách tương ứng. Vì vậy, bây giờ chúng tôi chỉ có thể nhận và đặt tên sách khi gọi các phương thức, nếu không, chúng tôi không thể trực tiếp nhận hoặc sửa đổi bất kỳ giá trị nào. Điều này thúc đẩy tính bảo mật cao cho dữ liệu của chúng tôi, bởi vì những người khác không biết sâu về cách các phương pháp sau được triển khai [nếu quyền truy cập của họ bị hạn chế]

Chúng tôi cũng có thể nâng cao mức độ an toàn cho dữ liệu của mình bằng cách sử dụng công cụ sửa đổi quyền truy cập. Hãy xem công cụ sửa đổi truy cập là gì

Công cụ sửa đổi quyền truy cập

Công cụ sửa đổi truy cập giới hạn quyền truy cập vào các biến và phương thức của một lớp. Python cung cấp ba loại công cụ sửa đổi quyền truy cập riêng tư, công khai và được bảo vệ

Trong Python, chúng tôi không có công cụ sửa đổi truy cập trực tiếp như công khai, riêng tư và được bảo vệ. Chúng ta có thể đạt được điều này bằng cách sử dụng dấu gạch dưới đơn và dấu gạch dưới kép

  • Thành viên công cộng. Có thể truy cập mọi nơi từ bên ngoài lớp học
  • Thành viên riêng. Chỉ có thể truy cập trong lớp
  • Thành viên được bảo vệ. Có thể truy cập trong lớp và đó là các lớp con

Dấu gạch dưới đơn _ đại diện cho lớp Được bảo vệ. Dấu gạch dưới kép __ đại diện cho lớp Riêng tư

Giả sử chúng ta cố gắng tạo một lớp Nhân viên

Mã số

class Human:
    #class attribute
    species = "Homo Sapiens"
6

Ở đây, chúng tôi đã công khai tên của nhân viên, ID của nhân viên được bảo vệ và tiền lương của nhân viên là riêng tư. Giả sử chúng ta cố gắng in tất cả các giá trị. Bây giờ, chúng tôi sẽ có thể truy cập tên hoặc ID của nhân viên, nhưng không thể truy cập vào tiền lương [vì nó là riêng tư]. Nhìn vào lỗi dưới đây

đầu ra

class Human:
    #class attribute
    species = "Homo Sapiens"
7

Tuy nhiên, chúng ta có thể truy cập vào tiền lương của nhân viên bằng cách gọi phương thức getter getSalary[] mà chúng ta đã tạo trong lớp Nhân viên của mình

Bây giờ, bạn có thể đã hiểu tầm quan trọng của getters và setters, cũng như các công cụ sửa đổi truy cập hạn chế quyền truy cập vào dữ liệu của bạn

Hoàn thành mã

class Human:
    #class attribute
    species = "Homo Sapiens"
8

đầu ra

class Human:
    #class attribute
    species = "Homo Sapiens"
9

Chúng ta có thể truy cập các thành viên private từ bên ngoài một lớp bằng cách tạo phương thức public để truy cập các thành viên private [giống như chúng ta đã làm ở trên]. Có một phương pháp khác để có quyền truy cập được gọi là xáo trộn tên

Thành viên dữ liệu được bảo vệ được sử dụng khi tính kế thừa được sử dụng và bạn muốn các thành viên dữ liệu chỉ có quyền truy cập vào các lớp con

Vì vậy, đóng gói bảo vệ một đối tượng khỏi sự truy cập trái phép. Nó cho phép các mức truy cập riêng tư và được bảo vệ để ngăn chặn việc sửa đổi dữ liệu ngẫu nhiên

trừu tượng

Có khả năng bạn đang đọc bài viết này trên máy tính xách tay, điện thoại hoặc máy tính bảng của mình. Bạn cũng có thể đang ghi chú, đánh dấu những điểm quan trọng và bạn có thể đang lưu một số điểm trong tệp nội bộ của mình khi đọc nó. Khi bạn đọc phần này, tất cả những gì bạn thấy trước mắt là một 'màn hình' và tất cả dữ liệu này được hiển thị cho bạn. Khi bạn nhập, tất cả những gì bạn thấy là các phím trên bàn phím và bạn không phải lo lắng về các chi tiết bên trong, chẳng hạn như cách nhấn một phím có thể dẫn đến việc hiển thị từ đó trên màn hình. Hoặc, cách nhấp vào một nút trên màn hình của bạn có thể mở một tab mới

Vì vậy, mọi thứ chúng ta có thể thấy ở đây đều ở mức độ trừu tượng. Chúng tôi không thể xem các chi tiết bên trong, mà chỉ thấy kết quả mà nó đang tạo ra [điều thực sự quan trọng đối với chúng tôi]

Trừu tượng hóa theo cách tương tự, chỉ cho chúng ta thấy các chức năng mà mọi thứ chứa đựng, ẩn tất cả các triển khai hoặc chi tiết bên trong

Mục tiêu chính của Trừu tượng là ẩn các chi tiết nền hoặc bất kỳ triển khai không cần thiết nào về dữ liệu để người dùng chỉ nhìn thấy thông tin cần thiết. Nó giúp xử lý sự phức tạp của mã

Các điểm chính của các lớp trừu tượng

  • Trừu tượng được sử dụng để ẩn các chi tiết nền hoặc bất kỳ triển khai không cần thiết nào về dữ liệu, để người dùng chỉ nhìn thấy thông tin cần thiết
  • Trong Python, sự trừu tượng hóa có thể đạt được bằng cách sử dụng các lớp trừu tượng
  • Một lớp bao gồm một hoặc nhiều phương thức trừu tượng được gọi là "lớp trừu tượng"
  • Các phương thức trừu tượng không chứa bất kỳ triển khai nào của riêng chúng
  • Lớp trừu tượng có thể được kế thừa bởi bất kỳ lớp con nào. Các lớp con kế thừa các lớp trừu tượng cung cấp các triển khai cho các phương thức trừu tượng của chúng
  • Các lớp trừu tượng có thể hoạt động giống như bản thiết kế cho các lớp khác, điều này rất hữu ích khi chúng ta thiết kế các hàm lớn. Và lớp con kế thừa chúng có thể tham chiếu các phương thức trừu tượng để triển khai các tính năng
  • Python cung cấp mô-đun abc để sử dụng trừu tượng hóa

Cú pháp của lớp trừu tượng trong Python

Để sử dụng tính trừu tượng, chúng ta bắt buộc phải nhập lớp ABC từ mô-đun abc

cú pháp

class Human:
    #class attribute
    species = "Homo Sapiens"
    def __init__[self, name, age, gender]:
        self.name = name
        self.age = age
        self.gender = gender
0

ABC là viết tắt của Lớp cơ sở trừu tượng. Mô-đun abc cung cấp cơ sở để xác định các lớp Cơ sở Trừu tượng [ABC]

Hãy để chúng tôi lấy một ví dụ và xem việc triển khai lớp trừu tượng

Vì vậy, đoạn mã trên để bạn tham khảo là

Mã số

class Human:
    #class attribute
    species = "Homo Sapiens"
    def __init__[self, name, age, gender]:
        self.name = name
        self.age = age
        self.gender = gender
1

đầu ra

class Human:
    #class attribute
    species = "Homo Sapiens"
    def __init__[self, name, age, gender]:
        self.name = name
        self.age = age
        self.gender = gender
2

Ở đây, chúng ta có một lớp trừu tượng Xe. Nó trừu tượng vì nó đang kế thừa lớp trừu tượng abc. Lớp Xe có một phương thức trừu tượng được gọi là no_of_wheels, không có bất kỳ định nghĩa nào, bởi vì các phương thức trừu tượng không được định nghĩa [hoặc các phương thức trừu tượng vẫn trống và chúng mong muốn các lớp kế thừa các lớp trừu tượng cung cấp triển khai cho phương thức]

Tuy nhiên, các lớp khác kế thừa lớp Xe, như Xe đạp, Nhịp độ hoặc Xe tải, định nghĩa phương thức no_of_wheels và chúng cung cấp triển khai riêng cho phương thức trừu tượng. Giả sử, xe đạp có 2 bánh, vì vậy nó in ra "Xe đạp có 2 bánh" trong phương thức trừu tượng kế thừa no_of_wheels. Và, tương tự, các lớp Tempo và Truck cũng cung cấp các triển khai của riêng chúng

Một số điểm đáng chú ý trên các lớp Trừu tượng là

  1. Các lớp trừu tượng không thể được khởi tạo. Nói một cách đơn giản, chúng ta không thể tạo các đối tượng cho các lớp trừu tượng
  2. Một lớp Trừu tượng có thể chứa cả hai loại phương thức -- phương thức bình thường và phương thức trừu tượng. Trong các phương pháp trừu tượng, chúng tôi không cung cấp bất kỳ định nghĩa hoặc mã nào. Nhưng trong các phương thức thông thường, chúng tôi cung cấp việc triển khai mã cần thiết cho phương thức

Ưu điểm của OOPS trong Python

Có rất nhiều ưu điểm của các khái niệm OOPS trong Python, thuận lợi cho việc viết các phần mềm nghiêm túc. Chúng ta hãy xem xét một vài trong số chúng --

  1. Giải quyết vấn đề hiệu quả bởi vì, đối với mỗi vấn đề nhỏ, chúng tôi viết một lớp thực hiện những gì được yêu cầu. Và sau đó chúng ta có thể sử dụng lại các lớp đó, điều này giúp giải quyết vấn đề tiếp theo thậm chí còn nhanh hơn
  2. Tính linh hoạt khi có nhiều dạng của một lớp, thông qua tính đa hình
  3. Giảm độ phức tạp cao của mã, mặc dù trừu tượng
  4. Bảo mật cao và quyền riêng tư dữ liệu thông qua đóng gói
  5. Sử dụng lại mã, bởi lớp con kế thừa các thuộc tính của lớp cha thông qua kế thừa
  6. Tính mô đun của mã cho phép chúng tôi gỡ lỗi dễ dàng, thay vì xem xét hàng trăm dòng mã để tìm một vấn đề

Phần kết luận

Trong bài viết này, chúng ta đã tìm hiểu về các khái niệm của mô hình lập trình thời thượng nhất - khái niệm OOPS trong python. Sau phần này, bạn hẳn đã hiểu rằng OOPS là một mô hình xử lý hoàn toàn khái niệm đối tượng. Và khái niệm này bị ảnh hưởng chặt chẽ như thế nào bởi các khía cạnh thực tế, như tính kế thừa, tính trừu tượng, tính đa hình, v.v. Hãy để chúng tôi tóm tắt lại những điểm chúng tôi đã đi qua trong bài viết này

Các khái niệm OOP trong Python là gì?

Khái niệm OOP của Python là gì? . Class, Object, Method, Inheritance, Polymorphism, Data Abstraction, and Encapsulation.

Lợi ích chính của OOP là gì?

Lợi ích của OOP . Công nghệ mới hứa hẹn năng suất lập trình viên cao hơn, chất lượng phần mềm tốt hơn và chi phí bảo trì thấp hơn. Hệ thống OOP có thể dễ dàng nâng cấp từ hệ thống nhỏ lên hệ thống lớn. allows to break the program into the bit-sized problems that can be solved easily [one object at a time]. The new technology promises greater programmer productivity, better quality of software and lesser maintenance cost. OOP systems can be easily upgraded from small to large systems.

Tại sao tôi nên học OOP trong Python?

OOP bằng Python . Các chương trình OOP ngăn bạn lặp lại mã vì một lớp có thể được xác định một lần và được sử dụng lại nhiều lần. it makes code more reusable and makes it easier to work with larger programs. OOP programs prevent you from repeating code because a class can be defined once and reused many times.

Chủ Đề