Mục lục[Ẩn giấu][Chỉ]
Trong bài giảng này, chúng ta sẽ tìm hiểu về các lớp, hàm tạo và kế thừa trong python.
Những khái niệm này thực sự quan trọng trong một chương trình lớn, nơi cần xác định các kiểu khác nhau.
Các lớp học
Các lớp rất cần thiết trong lập trình và chúng không dành riêng cho python. Nhiều người khác ngôn ngữ lập trình ủng hộ khái niệm về các lớp học. Chúng tôi sử dụng các lớp để định nghĩa các kiểu dữ liệu mới.
Cho đến nay, chúng ta đã tìm hiểu về các kiểu dữ liệu cơ bản trong Python như số, chuỗi và boolean. Đây là các kiểu dữ liệu cơ bản hoặc đơn giản trong Python. Chúng tôi cũng đã thấy một số kiểu dữ liệu phức tạp như danh sách và từ điển.
Mặc dù những loại này cực kỳ hữu ích, chúng không phải lúc nào cũng được sử dụng để mô hình hóa các khái niệm phức tạp. Ví dụ: nghĩ về ý tưởng về một điểm hoặc một giỏ hàng. Giỏ hàng không phải là một boolean hoặc một danh sách. Đó là một loại dữ liệu khác. Vì vậy, chúng ta có thể sử dụng các lớp để định nghĩa các kiểu mới để mô hình hóa các khái niệm thực.
Bây giờ, hãy xác định một kiểu dữ liệu mới được gọi là điểm. Loại mới này sẽ có các phương thức như chúng tôi đã kiểm tra trước đây.
Đây là cách bạn sẽ làm điều đó:
Chúng tôi bắt đầu bằng cách xác định một lớp bằng cách sử dụng từ khóa “class” và ngay sau đó chúng tôi đặt tên cho lớp của mình.
class Point
Bây giờ, hãy xem quy ước đặt tên mà tôi đã sử dụng ở đây. Tôi đã viết hoa chữ cái đầu tiên ở đây, đây là những gì chúng tôi gọi là quy ước đặt tên pascal. Quy ước này khác với quy ước mà chúng tôi sử dụng để đặt tên cho các biến và hàm mà chúng tôi luôn sử dụng chữ thường và phân tách nhiều từ bằng cách sử dụng dấu gạch dưới. Nhưng khi đặt tên cho các lớp, chúng ta không sử dụng dấu gạch dưới để phân tách nhiều từ mà thay vào đó, chúng ta viết hoa chữ cái đầu tiên của mỗi từ.
Sau khi xác định lớp của chúng ta, dấu hai chấm được sử dụng có nghĩa là bây giờ một khối đã được xác định.
class Point:
def move (self):
Trong khối này, chúng ta có thể xác định tất cả các hàm hoặc phương thức thuộc về điểm. Ví dụ, chúng ta có thể định nghĩa một hàm được gọi là "di chuyển" để di chuyển một điểm. Lưu ý rằng ngay khi chúng ta nhập dấu ngoặc đơn mở, PyCharm sẽ tự động thêm “self” vào đây. Đây là một từ khóa đặc biệt và hãy để tôi quay lại vấn đề này trong thời gian ngắn. Hãy in “chuyển động” trên thiết bị đầu cuối.
print("move")
Hãy xác định một phương thức khác như “draw” và in nó trên thiết bị đầu cuối.
def draw(self):
print("draw")
Chúng ta đã hoàn thành việc xác định lớp "điểm" của chúng ta. Với kiểu mới này, chúng ta có thể tạo các đối tượng mới. Một lớp chỉ đơn giản xác định bản thiết kế hoặc khuôn mẫu để tạo các đối tượng là các cá thể thực tế dựa trên bản thiết kế đó. Để tạo một đối tượng, chúng ta gõ tên lớp của chúng ta và sau đó gọi nó giống như một hàm. Điều này tạo ra một đối tượng mới và sau đó trả về nó. Sau đó, chúng ta có thể lưu trữ đối tượng đó trong một biến. Tôi se cho bạn xem:
Ở đây chúng tôi đã xác định “point1” là một điểm ba chiều. Bạn có thể thấy rằng, chúng tôi có thể in các tọa độ riêng lẻ trên thiết bị đầu cuối.
Chúng ta có thể sử dụng hai phương pháp "vẽ" và "di chuyển" với điểm này.
Vì vậy, để tóm tắt lại, chúng ta sử dụng các lớp để định nghĩa các kiểu mới và các kiểu này có thể có các phương thức mà chúng ta định nghĩa trong phần thân của lớp. Các lớp có thể có các thuộc tính mà chúng ta có thể đặt ở bất kỳ đâu trong chương trình của mình.
Người xây dựng
Cho đến nay, chúng ta đã học cách tạo kiểu mới bằng cách sử dụng các lớp. Bây giờ có một vấn đề nhỏ với việc triển khai này. Chúng ta có thể tạo một đối tượng điểm không có tọa độ x hoặc y bằng cách sử dụng các lớp và điều đó không lý tưởng. Tôi se cho bạn xem.
Hãy tạo một điểm và in nó trước khi chúng ta đặt tọa độ x. Việc chạy chương trình của chúng tôi dẫn đến một lỗi thuộc tính như sau:
Có nghĩa là đối tượng điểm không có thuộc tính nào được gọi là x. Bây giờ vấn đề là có thể có một đối tượng điểm không có tọa độ x hoặc y. Điều này không có ý nghĩa gì vì bất cứ khi nào chúng ta nói về một điểm, chúng ta cần biết điểm đó nằm ở đâu. Để giải quyết vấn đề này, chúng tôi sử dụng một hàm tạo. Hàm tạo là một hàm được gọi tại thời điểm tạo một đối tượng.
Đây là cách chúng tôi sử dụng một hàm tạo. Đầu tiên, hãy chuyển các giá trị tọa độ x và y trong chương trình trên.
point = Point(10, 20)
print(point.x)
Bây giờ, chúng ta cần thêm một phương thức đặc biệt trong lớp này được gọi là phương thức khởi tạo. Cú pháp của nó như thế này:
def __init__(self, x, y):
init
là viết tắt của khởi tạo và đây là hàm hoặc phương thức được gọi khi một đối tượng điểm mới được tạo. X và y được thêm vào ngay sau self
để thêm hai tham số bổ sung.
Sau đó, chúng ta nên ánh xạ x và y với các giá trị đã qua, tức là 10 và 20
self.x = x
self.y = y
Chúng tôi sử dụng self
để tham chiếu đến đối tượng hiện tại và sau đó chúng tôi đặt thuộc tính x thành đối số x được truyền cho hàm “x”. Theo cách này, sử dụng init
, chúng ta có thể khởi tạo các đối tượng của mình. Phương thức này được gọi là một phương thức khởi tạo. Hãy chạy chương trình của chúng tôi.
Bây giờ, chúng ta có thể thay đổi tọa độ x và y sau đó. Hãy cập nhật tọa độ x:
point = Point(10, 20)
point.x = 11
print(point.x)
Bây giờ, tọa độ x được cập nhật thành giá trị 11.
Tập thể dục
Đây là một bài tập thú vị dành cho bạn.
Tôi muốn bạn định nghĩa một kiểu mới được gọi là người. Các đối tượng "Người" này phải có "name
”Cũng như thuộc tính“talk()
" phương pháp.
Đó là một nhiệm vụ đơn giản và không mất quá vài phút.
Dung dịch
Bắt đầu với việc xác định lớp “Person” như thế này:
class Person:
self.name = name
Chúng ta sẽ xác định hàm tạo sau. Bây giờ, chúng ta có thể tạo đối tượng "Person". Hãy gọi nó là John
john = Person("John Smith")
print(john.name)
john.talk()
Bây giờ, hãy chuyển sang phần đầu tiên của mã và tạo một phương thức khởi tạo.
def __init__(self, name):
Mã cuối cùng sẽ giống như sau:
Bạn cũng có thể sử dụng các chuỗi được định dạng và các khái niệm khác cùng với các lớp và hàm tạo.
di sản
Kế thừa là một khái niệm khác liên quan đến các lớp cho phép bạn sử dụng lại mã.
Hãy xem xét đoạn mã này.
class Dog:
def walk(self):
print("walk")
Chúng tôi đã tạo một lớp "Dog" với phương thức "đi bộ". Trong phương pháp này, chúng tôi chỉ cần in thông báo đi bộ trên thiết bị đầu cuối. Giả sử, trong một chương trình thực, Ther là 10 dòng mã thay vì chỉ một dòng ở đây. Trong tương lai, nếu cần một lớp khác để có phương thức “walk”, chúng ta sẽ phải lặp lại tất cả mã đó. Đây không phải là lý tưởng.
Trong lập trình, chúng tôi có một nguyên tắc gọi là DRY, viết tắt của từ không lặp lại chính mình. Giả sử một lúc nào đó trong tương lai, chúng tôi phát hiện ra sự cố với phương pháp "đi bộ" của mình và nếu chúng tôi đã lặp lại hoặc sao chép phương pháp này ở nhiều nơi khác, chúng tôi sẽ phải quay lại và khắc phục sự cố đó ở mọi nơi mà chúng tôi đã sao chép phương pháp này mã số. Vì vậy, đó là lý do tại sao trong lập trình chúng ta không nên định nghĩa một cái gì đó hai lần.
Có nhiều cách tiếp cận khác nhau để khắc phục vấn đề này nhưng ở đây chúng ta sẽ tìm hiểu một cách dễ dàng hơn cho người mới bắt đầu và nó được gọi là kế thừa. Trong trường hợp này, chúng ta sẽ tạo một lớp “động vật có vú” khác và xác định thuộc tính “walk” của chúng ta trong lớp đó.
class Mammal:
def walk(self):
print("walk")
Sau khi xác định lớp “Động vật có vú”, chúng ta có thể sử dụng tính năng thừa kế để chuyển các thuộc tính như sau:
Cả hai lớp dog và cat đều kế thừa tất cả các phương thức của lớp được định nghĩa trong lớp cha của chúng. Bây giờ, chúng ta có thể thêm các phương pháp dành riêng cho chó như sau:
class Dog:
def bark(self):
print("bark")
Gói (lại!
Đây là tất cả về các lớp, các hàm tạo và sử dụng lại mã trong các lớp với các khái niệm kế thừa. Bây giờ chúng ta sắp kết thúc loạt bài của mình. Đến thời điểm này, bạn sẽ có thể tạo ra các mã tốt, dễ đọc và ngắn gọn bằng Python.
Chúng ta sẽ xem khái niệm mô-đun và gói trong bài giảng tiếp theo.
Bình luận