Ngôn ngữ lập trình hướng đối tượng và hướng thủ tục
Lập trình hướng đối tượng | Lập trình hướng thủ tục | |
1. | Lập trình hướng đối tượng là cách tiếp cận giải quyết vấn đề và được sử dụng trong đó tính toán được thực hiện bằng cách sử dụng các đối tượng. | Lập trình thủ tục sử dụng một danh sách các hướng dẫn để thực hiện tính toán từng bước. |
2. | Giúp phát triển và bảo trì dễ dàng hơn. | Trong lập trình thủ tục, khó đẻ bảo trì khi dự án mở rộng. |
3. | Trong lập trình thủ tục, không dễ để duy trì các mã khi dự án trở nên dài. | Nó không mô phỏng thế giới thực. Nó hoạt động theo từng bước hướng dẫn được chia thành các phần nhỏ gọi là hàm. |
4. | Nó cung cấp dữ liệu ẩn. Vì vậy, nó an toàn hơn các ngôn ngữ thủ tục. Bạn không thể truy cập dữ liệu riêng tư từ bất cứ đâu. | Ngôn ngữ thủ tục không cung cấp bất kỳ cách thích hợp nào để liên kết dữ liệu, vì vậy nó kém an toàn hơn. |
5. | Ví dụ về các ngôn ngữ lập trình hướng đối tượng là C++, Java, .Net, Python, C #, v.v. | Ví dụ về các ngôn ngữ thủ tục là: C, Fortran, Pascal, VB, v.v. |
Lớp và đối tượng trong lập trình hướng đối tượng với Python
Lớp là gì ?
Nếu hỏi một bạn đã biết về lập trình hướng đối tượng (bất kể ngôn ngữ nào) rằng bạn nghĩ tới từ nào đầu tiên khi nói về OOP có lẽ hầu hết câu trả lời nhận được sẽ là: class (Hay tiếng Việt là lớp).
Vậy, class là gì? Nói đơn giản nó giống như là một bản mẫu, một khuôn mẫu. Ở đó ta khai báo các thuộc tính (attribute) và phương thức (method) nhằm miêu tả để từ đó ta tạo ra được những object (đối tượng)
Lưu ý: đôi khi object người ta cũng có thể ghi là instance, tuy nó không sát nghĩa cho lắm. Bạn không cần bận tâm lắm đâu vì vào ví dụ ta sẽ hiểu thêm, còn nếu bạn muốn hiểu kĩ thì hãy nghiền ngẫm câu tiếng Anh sau: “Objects are instances of types. 42 is an instance of the type int is equivalent to 42 is an int object”
Cú pháp để tạo một lớp
class
# code
Giả sử giờ ta tạo một lớp để miêu tả siêu nhân.
class SieuNhan: pass # lệnh giữ chỗ
Lưu ý: theo chuẩn PEP8 về đặt tên của lớp (class) thì sẽ được viết theo kiểu CapWords. Bạn có thể theo hoặc không theo, vì đây chỉ là một chuẩn format code Python thôi.
Rồi nào, ta đã có một khuôn mẫu của siêu nhân rồi, cái ta cần là một đối tượng thuộc lớp siêu nhân.
class SieuNhan: pass sieu_nhan_A = SieuNhan() # sieu_nhan_A chính là một object thuộc lớp SieuNhan print(sieu_nhan_A)
Kết quả:
<__main__.SieuNhan object at 0x0106CD10>
__main__.SieuNhan nghĩa là đây là đối tượng thuộc lớp SieuNhan ở hàm main (có nghĩa là ở file ta đang chạy thực thi) kèm theo cái nơi cư trú của nó – thứ mà ta không cần bận tâm lắm lúc này.
Kế thừa (Inheritance)
Kế thừa là khả năng của một class để lấy hoặc kế thừa các thuộc tính từ một lớp khác. Lớp dẫn xuất các thuộc tính được gọi là lớp dẫn xuất hoặc lớp con và lớp mà từ đó các thuộc tính được dẫn xuất được gọi là lớp cơ sở hoặc lớp cha. Lợi ích của việc thừa kế là:
Nó thể hiện tốt các mối quan hệ tại thế giới thực.
- Nó cung cấp khả năng tái sử dụng code. Bạn không phải viết lại code nhiều lần. Ngoài ra, nó cũng cho phép lập trình viên thêm nhiều tính năng hơn vào class mà không cần chỉnh sửa nó.
- Về bản chất, nó có tính chất bắc cầu. Điều đó có nghĩa nếu class B kế thừa class A khác, thì tất cả class phụ của B sẽ tự động kế thừa A.
Các kiểu kế thừa:
- Kế thừa đơn: Kế thừa một cấp cho phép lớp dẫn xuất kế thừa các đặc điểm từ lớp cha đơn.
- Kế thừa đa cấp: Kế thừa đa cấp cho phép một lớp dẫn xuất kế thừa các thuộc tính từ lớp cha trực tiếp, từ đó kế thừa các thuộc tính từ lớp cha của nó.
- Kế thừa theo thứ bậc: Kế thừa ở cấp độ thứ bậc cho phép nhiều lớp dẫn xuất kế thừa các thuộc tính từ một lớp cha.
- Đa kế thừa: Kế thừa nhiều cấp cho phép một lớp dẫn xuất kế thừa các thuộc tính từ nhiều lớp cơ sở.
# Lớp cha class Car: # Constructor def __init__(self, hangxe, tenxe, mausac): # Lớp Car có 3 thuộc tính: tenxe, mausac, hang xe self.hangxe = hangxe self.tenxe = tenxe self.mausac = mausac # phương thức def chayxe(self): print ("{} đang chạy trên đường".format(self.tenxe)) def dungxe(self, mucdich): print ("{} đang dừng xe để {}".format(self.tenxe, mucdich)) # Lớp Toyota mở rộng từ lớp Car. class Toyota(Car): def __init__(self, hangxe, tenxe, mausac, nguyenlieu): # Gọi tới constructor của lớp cha (Car) # để gán giá trị vào thuộc tính của lớp cha. super().__init__(hangxe, tenxe, mausac) self.nguyenlieu = nguyenlieu # Kế thừa phương thức cũ def chayxe(self): print ("{} đang chạy trên đường".format(self.tenxe)) # Ghi đè (override) phương thức cùng tên của lớp cha. def dungxe(self, mucdich): print ("{} đang dừng xe để {}".format(self.tenxe, mucdich)) print ("{} chạy bằng {}".format(self.tenxe, self.nguyenlieu)) # Bổ sung thêm thành phần mới def nomay(self): print ("{} đang nổ máy".format(self.tenxe)) toyota1 = Toyota("Toyota", "Toyota Hilux", "Đỏ", "Điện") toyota2 = Toyota("Toyota", "Toyota Yaris", "Vàng", "Deisel") toyota3 = Toyota("Toyota", "Toyota Vios", "Xanh", "Gas") toyota1.dungxe("nạp điện") toyota2.chayxe() toyota3.nomay()
Kết quả trả về:
Toyota Hilux đang dừng xe để nạp điện Toyota Hilux chạy bằng Điện Toyota Yaris đang chạy trên đường Toyota Vios đang nổ máy
Chương trình này tạo hai lớp kế thừa: lớp cha Car và lớp con Toyota.
Khai báo constructor mới để gán giá trị vào thuộc tính của lớp cha. Hàm super() đứng trước phương thức __init __ để gọi tới nội dung __init __ của Car.
Class Toyota kế thừa hàm chayxe() và dungxe() của class Car đồng thời sửa đổi một hành vi thể hiện ở phương thức dungxe(). Sau đó lớp con bổ sung thêm thành phần mới là nomay() để mở rộng kế thừa.
Đóng gói (Encapsulation)
Sử dụng OOP trong Python, chúng ta có thể hạn chế quyền truy cập vào trạng thái bên trong của đối tượng. Điều này ngăn chặn dữ liệu bị sửa đổi trực tiếp, được gọi là đóng gói. Trong Python, chúng ta biểu thị thuộc tính private này bằng cách sử dụng dấu gạch dưới làm tiền tố: “_” hoặc “__“.
class Computer: def __init__(self): self.__maxprice = 900 def sell(self): print("Giá bán sản phẩm là: {}".format(self.__maxprice)) def setMaxPrice(self, price): self.__maxprice = price c = Computer() c.sell() # thay đổi giá: c.__maxprice = 1000 c.sell() # sử dụng hàm để thay đổi giá: c.setMaxPrice(1000) c.sell()
Màn hình hiển thị kết quả:
Giá bán sản phẩm là: 900 Giá bán sản phẩm là: 900 Giá bán sản phẩm là: 1000 >
Ở ví dụ này, bạn khởi tạo class Computer, sử dụng __init __() để lưu trữ giá bán tối đa của máy tính. Nhưng sau khi sử dụng, bạn có nhu cầu sửa đổi giá, tuy nhiên không thể thay đổi theo cách bình thường vì Python đã coi __maxprice là thuộc tính private. Vậy nên để thay đổi giá trị, ta sử dụng hàm setter setMaxPrice().
Tài liệu
Nhằm phục vụ mục đích học tập Offline của cộng đồng, Kteam hỗ trợ tính năng lưu trữ nội dung LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG VỚI PYTHON dưới dạng file PDF trong link bên dưới mỗi bài học.
Ngoài ra, bạn cũng có thể tìm thấy các tài liệu được đóng góp từ cộng đồng ở mục TÀI LIỆU trên thư viện Howkteam.com
Đừng quên like hoặc +1 Google để ủng hộ Kteam và tác giả nhé!
Về tác giả:
I
HATE PYTHON Team
I Hate Python – Chúng tôi là những người có niềm yêu thích Python và muốn Python được nhiều người biết đến hơn ở Việt Nam.
Vì lẽ đó, chúng tôi đã hợp tác với Kteam tạo ra khóa học miễn phí này với hy vọng thực hiện được mong muốn Việt Nam sẽ là một hệ sinh thái tuyệt vời mà ở đó sẽ có nhiều những thiên tài Python.
Phương châm: “ Quan trọng là bạn có đủ __passion__ không thôi. Đừng kiếm các __reason__ để đổ lỗi cho nhà trường, xã hội.”
Kiến thức cần có
Để có thể tìm hiểu series lập trình hướng đối tượng này với Kteam, bạn đọc cần có những kiến thức cơ bản về Python trong khóa LẬP TRÌNH PYTHON CƠ BẢN.
Nếu bạn chưa có thời gian để học hết khóa này thì hãy đảm bảo đã tìm hiểu những kiến thức sau đây
- Biến và các kiểu dữ liệu cơ bản của Python (Số, chuỗi, List, Tuple, Dict, Set, Range)
- Một số toán tử cơ bản (+, -, *, /, %)
- Khối lệnh điều kiện
- Khối vòng lặp (for, loop)
- Hàm
Và đương nhiên để học tiếp bài sau, bạn phải nắm vững kiến thức ở các bài trước
Lớp (Class) và Đối tượng (Object)
Class và Object là hai khái niệm cơ bản trong lập trình hướng đối tượng.
Đối tượng (Object) là những thực thể tồn tại có hành vi.
Ví dụ đối tượng là một xe ô tô có tên hãng, màu sắc, loại nguyên liệu, hành vi đi, dừng, đỗ, nổ máy…
Lớp (Class) là một kiểu dữ liệu đặc biệt do người dùng định nghĩa, tập hợp nhiều thuộc tính đặc trưng cho mọi đối tượng được tạo ra từ lớp đó.
Thuộc tính là các giá trị của lớp. Sau này khi các đối tượng được tạo ra từ lớp, thì thuộc tính của lớp lúc này sẽ trở thành các đặc điểm của đối tượng đó.
Phân biệt giữa Đối tượng (Object) và Lớp (Class):
Đối tượng (Object): có trạng thái và hành vi.
Lớp (Class): có thể được định nghĩa như là một template mô tả trạng thái và hành vi mà loại đối tượng của lớp hỗ trợ. Một đối tượng là một thực thể (instance) của một lớp
Ví dụ về Class và Object:
class Car: # thuộc tính lớp loaixe = "Ô tô" # thuộc tính đối tượng def __init__(self, tenxe, mausac, nguyenlieu): self.tenxe = tenxe self.mausac = mausac self.nguyenlieu = nguyenlieu # instantiate the Car class toyota = Car("Toyota", "Đỏ", "Điện") lamborghini = Car("Lamborghini", "Vàng", "Deisel") porsche = Car("Porsche", "Xanh", "Gas") # access the class attributes print("Porsche là {}.".format(porsche.__class__.loaixe)) print("Toyota là {}.".format(toyota.__class__.loaixe)) print("Lamborghini cũng là {}.".format(lamborghini.__class__.loaixe)) # access the instance attributes print("Xe {} có màu {}. {} là nguyên liệu vận hành.".format( toyota.tenxe, toyota.mausac, toyota.nguyenlieu)) print("Xe {} có màu {}. {} là nguyên liệu vận hành.".format( lamborghini.tenxe, lamborghini.mausac,lamborghini.nguyenlieu)) print("Xe {} có màu {}. {} là nguyên liệu vận hành.".format( porsche.tenxe, porsche.mausac, porsche.nguyenlieu))
Kết quả trả về sẽ là:
Porsche là Ô tô. Toyota là Ô tô. Lamborghini cũng là Ô tô. Xe Toyota có màu Đỏ. Điện là nguyên liệu vận hành. Xe Lamborghini có màu Vàng. Deisel là nguyên liệu vận hành. Xe Porsche có màu Xanh. Gas là nguyên liệu vận hành. >
Chương trình trên tạo một lớp Car, sau đó xác định các thuộc tính, đặc điểm của đối tượng
Chúng ta truy cập thuộc tính class bằng cách sử dụng __class __.loaixe. Các thuộc tính lớp được chia sẻ cho tất cả các cá thể của lớp.
Tương tự, chúng ta truy cập các thuộc tính instance bằng cách sử dụng toyota.tenxe, toyota.mausac và toyota.nguyenlieu.
Tuy nhiên, các thuộc tính instance là khác nhau cho mỗi cá thể của một lớp.
So sánh class cha và class con
Ví dụ tạo một class con cho từng thành phần:
class Dog: species = "Canis familiaris" def __init__(self, name, age): self.name = name self.age = age def __str__(self): return f"{self.name} is {self.age} years old" def speak(self, sound): return f"{self.name} says {sound}"
Nhớ rằng để tạo một class con, bạn tạo class mới bằng tên riêng của nó, rồi nhập tên class cha vào trong dấu ngoặc đơn. Thêm dòng sau vào file dog.py để tạo 3 class con mới cho class Dog:
class JackRussellTerrier(Dog): pass class Dachshund(Dog): pass class Bulldog(Dog): Pass
Nhấn F5 để lưu và chạy file. Với claas đã được xác định, giờ bạn có thể khởi tạo một số giống chó cụ thể trong cửa sổ tương tác:
>>> miles = JackRussellTerrier("Miles", 4) >>> buddy = Dachshund("Buddy", 9) >>> jack = Bulldog("Jack", 3) >>> jim = Bulldog("Jim", 5)
Các phiên bản của lớp con kế thừa tất cả các thuộc tính và phương thức của lớp cha:
>>> miles.species 'Canis familiaris' >>> buddy.name 'Buddy' >>> print(jack) Jack is 3 years old >>> jim.speak("Woof") 'Jim says Woof'
Để xác định class một đối tượng được cung cấp thuộc về, bạn có thể dùng type() sau:
>>> type(miles)
Nếu muốn xác định xem liệu miles có phải một phiên bản của class Dog? Bạn có thể làm việc này bằng isinstance():
>>> isinstance(miles, Dog) True
Nhìn chung, toàn bộ đối tượng được tạo từ class con là các phiên bản của class cha, dù chúng có thể không phải phiên bản của class con khác.
Điểm cần ghi nhớ về class
- Class được tạo bởi class keyword (từ khóa).
- Thuộc tính là biến thuộc về class.
- Thuộc tính luôn công khai và có thể được truy cập bằng toán tử (.). Ví dụ: Myclass.Myattribute
Đa hình (Polymorphism)
Tính đa hình là khái niệm mà hai hoặc nhiều lớp có những phương thức giống nhau nhưng có thể thực thi theo những cách thức khác nhau.
Giả sử, chúng ta cần tô màu một hình khối, có rất nhiều lựa chọn cho hình của bạn như hình chữ nhật, hình vuông, hình tròn. Tuy nhiên, bạn có thể sử dụng cùng một phương pháp để tô màu bất kỳ hình dạng nào.
class Toyota: def dungxe(self): print("Toyota dừng xe để nạp điện") def nomay(self): print("Toyota nổ máy bằng hộp số tự động") class Porsche: def dungxe(self): print("Porsche dừng xe để bơm xăng") def nomay(self): print("Porsche nổ máy bằng hộp số cơ") # common interface def kiemtra_dungxe(car): car.dungxe() # instantiate objects toyota = Toyota() porsche = Porsche() # passing the object kiemtra_dungxe(toyota) kiemtra_dungxe(porsche)
Ở ví dụ này, bạn vừa tạo hai lớp Toyota và Porsche, cả hai lớp đều có phương thức dungxe(). Truy nhiên hàm của chúng khác nhau. Ta sử dụng tính đa hình để tạo hàm chung cho hai lớp, đó là kiemtra_dungxe(). Tiếp theo, bạn truyền đối tượng toyota và porsche vào hàm vừa tạo, và ta lấy được kết quả như này:
Toyota dừng xe để nạp điện Porsche dừng xe để bơm xăng
Vậy là Quantrimang vừa giới thiệu cho bạn những điểm nổi bật của OOP rồi. Qua bài viết, có thể rút ra một số nhận xét như này:
- Lập trình trở nên dễ dàng và hiệu quả hơn.
- Class có thể chia sẻ được nên code dễ dàng được sử dụng lại.
- Năng suất của chương trình tăng lên
- Dữ liệu an toàn và bảo mật với trừu tượng hóa dữ liệu.
Lập trình hướng đối tượng trong Python
Lập trình hướng đối tượng Python là gì? Hay dùng OOP Python như thế nào? Hãy cùng Quantrimang.com tìm hiểu mọi điều bạn cần biết về OOP trong Python nhé!
Python là một trong số ngôn ngữ lập trình phổ biến nhất hiện nay. Bạn dễ dàng tìm thấy nó trong các ứng dụng, phần mềm hay trang web thông dụng. Điểm nổi bật của Python là nó có tính hướng đối tượng mạnh. Dưới đây là những điều bạn cần biết về lập trình hướng đối tượng trong Python.
Giới thiệu về OOP trong Python
Lập trình hướng đối tượng Python (OOP) là một mô hình lập trình sử dụng các đối tượng và lớp trong lập trình. Nó nhằm mục đích triển khai các thực thể trong thế giới thực như kế thừa, đa hình, đóng gói, v.v. bằng lập trình. Khái niệm chính của OOP là liên kết dữ liệu và các chức năng hoạt động trên dữ liệu đó với nhau thành một đơn vị duy nhất để không phần nào khác của mã có thể truy cập dữ liệu này.
Các khái niệm cơ bản trong lập trình Python hướng đối tượng:
- Class
- Objects
- Polymorphism
- Encapsulation
- Inheritance
- Data Abstraction
Khái niệm về OOP trong Python tập trung vào việc tạo code sử dụng lại. Khái niệm này còn được gọi là DRY (Don’t Repeat Yourself).
Giờ hãy cùng nhau tìm hiểu chi tiết nhé!
Phương thức
Phương thức (Method) là các hàm được định nghĩa bên trong phần thân của một lớp. Chúng được sử dụng để xác định các hành vi của một đối tượng.
Ví dụ về Class và Method
class Car: # thuộc tính đối tượng def __init__(self, tenxe, mausac, nguyenlieu): self.tenxe = tenxe self.mausac = mausac self.nguyenlieu = nguyenlieu # phương thức def dungxe(self, mucdich): return "{} đang dừng xe để {}".format(self.tenxe,mucdich) def chayxe(self): return "{} đang chạy trên đường".format(self.tenxe) def nomay(self): return "{} đang nổ máy".format(self.tenxe) # instantiate the Car class toyota = Car("Toyota", "Đỏ", "Điện") lamborghini = Car("Lamborghini", "Vàng", "Deisel") porsche = Car("Porsche", "Xanh", "Gas") # call our instance methods print(toyota.dungxe("nạp điện")) print(lamborghini.chayxe()) print(porsche.nomay())
Chạy chương trình, màn hình sẽ trả về kết quả:
Toyota đang dừng xe để nạp điện Lamborghini đang chạy trên đường Porsche đang nổ máy
Ở ví dụ này, có ba phương thức là dungxe(), chayxe() và nomay(). Chúng được gọi là phương thức instance bởi vì chúng được gọi trên một đối tượng instance (toyota, lamborghini, porsche).
Nội dung
Để theo dõi bài này một cách tốt nhất, bạn nên có có những kiến thức cơ bản về Python trong khóa LẬP TRÌNH PYTHON CƠ BẢN
Nếu bạn chưa có thời gian để học hết khóa trên thì hãy đảm bảo đã tìm hiểu những kiến thức sau đây
- BIẾN và CÁC KIỂU DỮ LIỆU CƠ BẢN của Python (Số, chuỗi, List, Tuple, Dict, Set, Range)
- Một số toán tử cơ bản (+, -, *, /, %)
- Khối lệnh điều kiện Khối vòng lặp như VÒNG LẶP FOR, VÒNG LẶP IF)
- HÀM
Và đương nhiên để học tiếp bài sau, bạn phải nắm vững kiến thức ở các bài trước
Bạn và Kteam sẽ cùng tìm hiểu những nội dụng sau đây
- Lớp là gì ?
- Thuộc tính là gì ?
- Hàm constructor (initialize method)
- Phương thức là gì ?
Đối tượng tham gia
Serial này dành cho tất cả các bạn yêu thích lập trình và mong muốn tìm hiểu sâu hơn về python cũng như lập trình hướng đối tượng với python.
Sẽ có lợi thế hơn nếu bạn đã học qua khóa LẬP TRÌNH PYTHON CƠ BẢN và từng học lập trình hướng đối tượng với ngôn ngữ khác.
Thời lượng mỗi video từ 3 – 30 phút nhằm chia nhỏ quá trình thực hiện, giúp bạn dễ tiếp thu và ứng dụng source code hỗ trợ từ thư viện Howkteam.com
Tải xuống
Tài liệu
Nhằm phục vụ mục đích học tập Offline của cộng đồng, Kteam hỗ trợ tính năng lưu trữ nội dung bài học Lớp và đối tượng trong lập trình hướng đối tượng với Python dưới dạng file PDF trong link bên dưới.
Ngoài ra, bạn cũng có thể tìm thấy các tài liệu được đóng góp từ cộng đồng ở mục TÀI LIỆU trên thư viện Howkteam.com
Đừng quên like và share để ủng hộ Kteam và tác giả nhé!
Giới thiệu khóa học
Nhắc đến lập trình hướng đối tượng, mọi người nghĩ ngay tới những Java, C++, C#,… Và bên cạnh đó, tuy không nhiều, nhưng vẫn được nhắn đến đó chính là chú trăn thanh lịch Python.
Ở khóa học này, Kteam sẽ giới thiệu với các bạn những kiến thức cơ bản về Lập trình hướng đối tượng trong Python một cách dễ hiểu, từ đó bạn có thể ứng dụng kiến thức hướng đối tượng khi tiếp xúc với các framework, package của Python.
Không những thế, bạn cũng sẽ dễ dàng tiếp cận sâu hơn về lập trình hướng đối tượng khác khi bạn chuyển đổi sang lập trình bằng ngôn ngữ khác, vì như đã nói, hướng đối tượng có ở hầu hết mọi ngôn ngữ hiện nay và được ứng dụng rất rộng rãi
Tham gia đóng góp khóa học cộng đồng
Nếu bạn muốn gửi đến cộng đồng những khóa học do chính bạn/ team của bạn thực hiện. Đừng ngần ngại liên hệ với Kteam để được hỗ trợ nhé!
Hàm constructor (initialize method)
Mở rộng vấn đề, ta cần khai báo khoảng 1000 siêu nhân. Giải sử một siêu nhân có 3 thuộc tính như trên vị chi ta sẽ mất 3000 dòng khai báo. Tuy là bạn vẫn có thể khai báo chỉ bằng 1000 dòng bằng cách khai báo one-liner của Python tuy nhiên đôi lúc những thuộc tính của đối tượng không dễ dàng để khai báo một cách đơn giản như vậy.
Ta cần phải cần một cái khuôn mẫu mà chỉ cần đưa các giá trị thuộc tính vào còn việc gán giá trị thì để cho khuôn mẫu làm. Dĩ nhiên khuôn mẫu có thể, nếu ta xây dựng cho nó một hàm constructor.
class SieuNhan: def __init__(self): pass
Lưu ý: 2 dấu gạch “_” bắt đầu và kết thúc
Giải thích một vài điều, đây là tên hàm được quy ước, nếu bạn đặt tên hàm như vậy, bạn mặc định nói với chương trình rằng đây là constructor (nó là gì thì bạn từ từ sẽ biết). Trong Python, một số hàm trong lớp sẽ được tự động gọi khi ta khai báo một đối tượng và constructor là một trong số những hàm đó.
Từ khóa self hay cụ thể ở đây là parameter self là một quy ước (lưu ý là hoàn toàn sẽ không bị bắt lỗi cú pháp nếu dùng từ khóa khác), bạn có thể dùng một từ khóa khác. Tuy nhiên từ trước tới giờ mình chưa thấy ai dùng một tứ khóa khác ngoài self. Nếu bạn không muốn gây hiểu lầm cho người khác thậm chí khiến người khác nghĩ là bạn viết code sai thì bạn nên sử dụng từ khóa self.
Vậy, từ khóa self là gì? Không ngẫu nhiên mà người ta lại lấy từ self. Ý nghĩa của nó là chính đối tượng đó. Hơi khó hiểu nhỉ? Coi ví dụ đã, bạn sẽ dần tự hiểu ra từ khóa này.
class SieuNhan: def __init__(self, para_ten, para_vu_khi, para_mau_sac): self.ten = "Sieu nhan " + para_ten self.vu_khi = para_vu_khi self.mau_sac = para_mau_sac sieu_nhan_A = SieuNhan("do", "Kiem", "Do")
Đầu tiên, từ khóa self sẽ nhận giá trị chính là đối tượng đã gọi hàm đó. Ủa? Hàm __init__ có đối tượng nào gọi đâu? Đương nhiên là không cần gọi, nó đã được tự động gọi khi bạn khởi tạo đối tượng rồi, có nghĩa là khi bạn dung lớp SieuNhan khởi tạo ra đối tượng sieu_nhan_A mặc định bạn đã kêu đối tượng sieu_nhan_A gọi hàm __init__. Và đương nhiên, self được gán bằng đối tượng sieu_nhan_A, các argument “do”, “Kiem”, “Do” còn lại sẽ được truyền vào theo tứ tự. Bạn hãy thử xem lại cách thủ công khai báo thuộc tính lúc ban đầu bạn sẽ thấy nó tương tự.
Bạn nên nhớ rằng mỗi khi có một đối tượng nào đó gọi một hàm thì luôn luôn tối thiểu sẽ có một argument được gửi vào hàm đó chính là chính đối tượng đó, nếu hàm đó không có parameter nhận thì sẽ sinh lỗi, còn nếu dư argument (vì ta không lường trước được có một argument là chính đối tượng được ngầm gửi vào) thì vẫn sẽ có lỗi tràn argument. Còn nếu mà gửi vào vẫn không có lỗi thì…Bug này nặng khó fix đây.
Khi ta thử in ra các thuộc tính
print("Ten cua sieu nhan la:",sieu_nhan_A.ten) print("Sieu nhan mau:", sieu_nhan_A.mau_sac) print("Su dung vu khi:", sieu_nhan_A.vu_khi)
Kết quả :
Ten cua sieu nhan la: Sieu nhan do Sieu nhan mau: Do Su dung vu khi: Kiem
Kiến thức truyền tải
Khoá học tập trung vào kiến thức về:
- Lớp & đối tượng trong Python OOP.
- Cách khai báo, sử dụng Class & tìm hiểu các phương thức trong class
- Lớp kế thừa & các phương thức đặc biệt
- Setters, Getters & Deleters
- Nâng cao tư duy lập trình hướng bằng cách ứng dụng một số ví dụ với Python
- Và nhiều kinh nghiệm hay ho khác từ tác giả.
Các nguyên lý
Trong Python, khái niệm về OOP tuân theo một số nguyên lý cơ bản là tính đóng gói, tính kế thừa và tính đa hình.
- Tính kế thừa (Inheritance): cho phép một lớp (class) có thể kế thừa các thuộc tính và phương thức từ các lớp khác đã được định nghĩa.
- Tính đóng gói (Encapsulation): là quy tắc yêu cầu trạng thái bên trong của một đối tượng được bảo vệ và tránh truy cập được từ code bên ngoài (tức là code bên ngoài không thể trực tiếp nhìn thấy và thay đổi trạng thái của đối tượng đó).
- Tính đa hình (Polymorphism): là khái niệm mà hai hoặc nhiều lớp có những phương thức giống nhau nhưng có thể thực thi theo những cách thức khác nhau.
Thuộc tính là gì?
Siêu nhân (SN) của ta chưa có thuộc tính gì, ta cần phải giúp SN có thêm một vài thuộc tính. Khi khai báo thuộc tính cho một đối tượng, bạn phải nghĩa ra những thuộc tính để mà giúp ta có thể phân biệt nó với những đối tượng khác cùng lớp, ví dụ như giữa 2 thằng con trai đừng lấy giới tính ra để phân biệt mà nên dùng hơn là sử dụng tên.
Vậy nghĩ tới siêu nhân, ta nghĩ tới cái gì? Tên, vũ khí, màu sắc,…
Bạn đọc xem đoạn code ví dụ dưới đây để biết khai báo thuộc tính ĐƠN GIẢN và cách lấy thuộc tính
class SieuNhan: pass sieu_nhan_A = SieuNhan() sieu_nhan_A.ten = "Sieu nhan do" sieu_nhan_A.vu_khi = "Kiem" sieu_nhan_A.mau_sac = "Do" print("Ten cua sieu nhan la:",sieu_nhan_A.ten) print("Sieu nhan mau:", sieu_nhan_A.mau_sac) print("Su dung vu khi:", sieu_nhan_A.vu_khi)
Kết quả:
Ten cua sieu nhan la: Sieu nhan do Sieu nhan mau: Do Su dung vu khi: Kiem
Lưu ý là thuộc tính nào có mới lấy ra được nhé, chứ cái class của chúng ta không tự động sinh ra thuộc tính đâu
print("Chi so suc manh: ", sieu_nhan_A.suc_manh)
Kết quả:
AttributeError: 'SieuNhan' object has no attribute 'suc_manh'
Phương thức là gì?
Giờ ta thử giúp SN của chúng ta có một câu giới thiệu. Ta tạo một hàm để làm điều đó.
class SieuNhan: def __init__(self, para_ten, para_vu_khi, para_mau_sac): self.ten = "Sieu nhan " + para_ten self.vu_khi = para_vu_khi self.mau_sac = para_mau_sac def xin_chao(self): return "Xin chao, ta chinh la " + self.ten sieu_nhan_A = SieuNhan("do", "Kiem", "Do") print(sieu_nhan_A.xin_chao()) # vì nó là hàm nên nhớ là hãy thêm () để gọi hàm print(SieuNhan.xin_chao(sieu_nhan_A)) # một cách gọi khác nhưng rất không phổ biến
Kết quả:
Xin chao, ta chinh la Sieu nhan do Xin chao, ta chinh la Sieu nhan do
Thông thường, khi nói tới hàm của lớp, người ta hay gọi là phương thức (method). Khi nói tới hàm thì nó là một chương trình bé bé chờ bạn thực thi, còn khi gọi nó là phương thức thì nó là hàm nhưng liên quan tới lớp thôi. Người ta thường hay « call function », « invoke method ». Nhớ đừng nhầm lẫn nhé, người ta cười cho đấy.
Thảo luận
Nếu bạn có bất kỳ khó khăn hay thắc mắc gì về khóa học, đừng ngần ngại đặt câu hỏi trong phần bên dưới hoặc trong mục HỎI & ĐÁP trên thư viện Howkteam.com để nhận được sự hỗ trợ từ cộng đồng.
Nội dung bài viết
Khóa học
Lập trình Hướng Đối Tượng với Python
Nhắc đến lập trình hướng đối tượng, mọi người nghĩ ngay tới những Java, C++, C#,… Và bên cạnh đó, tuy không nhiều, nhưng vẫn được nhắn đến đó chính là chú trăn thanh lịch Python.
Ở khóa học này, Kteam sẽ giới thiệu với các bạn những kiến thức cơ bản về Lập trình hướng đối tượng trong Python một cách dễ hiểu, từ đó bạn có thể ứng dụng kiến thức hướng đối tượng khi tiếp xúc với các framework, package của Python.
Không những thế, bạn cũng sẽ dễ dàng tiếp cận sâu hơn về lập trình hướng đối tượng khác khi bạn chuyển đổi sang lập trình bằng ngôn ngữ khác, vì như đã nói, hướng đối tượng có ở hầu hết mọi ngôn ngữ hiện nay và được ứng dụng rất rộng rãi
Đánh giá
Bình luận
rất dễ hiểu, nhưng mà nói nhảm quá, toàn đọc trong tài liệu không khác 1 chữ quá good luôn, và toàn nói siêu nhân thấy gáng như trẻ nhỏ vậy
class Camonkteam:
j = 0
while j < 1000:
print(‘Cảm ơn Kteam’)
j += 1
Thank = CamonKteam()
print(Thank)
Nó có
Phần mở rộng tên file của Python có nhiều dạng như: .py,.pyc, .pyd, .pyo, .pyw, .pyz. Nó là hướng đối tượng, chức năng, thủ tục, phản ánh và mệnh lệnh. Hiện đang được duy trì và phát triển bởi Python Software Foundation. Python chủ yếu bị ảnh hưởng bởi các ngôn ngữ như CoffeeScript, JavaScript, Go, Ruby, Swift và Groovy. Nó cũng là một ngôn ngữ lập trình đa mô hình. Các đặc điểm lập trình chức năng của Python được lấy cảm hứng từ ngôn ngữ lập trình Lisp. Ngoài ra, Python còn hỗ trợ lập trình hướng khía cạnh (Aspect-Oriented Programming).
Lập trình hướng đối tượng
Mô hình lập trình hướng đối tượng hoạt động bằng cách tương tác và gọi các thuộc tính giữa các đối tượng khác nhau. Có nhiều khái niệm khác nhau như:
Lớp (Class), Đối tượng (Object), Tính đa hình (Polymorphism), Tính đóng gói (Encapsulation), Tính kế thừa (Inheritance).
Các đặc điểm phân biệt của Lập trình hướng đối tượng:
So sánh với các ngôn ngữ lập trình hướng đối tượng khác
Các ngôn ngữ lập trình hướng đối tượng khác bao gồm C++, Java, Objective C, Ruby, Smalltalk, Visual Basic.NET, Simula, JavaScript,… Python có sự tương đương với Java, JavaScript trong việc tham chiếu đến đối tượng. Trong Python, lớp (class) được dùng để định nghĩa Lớp (Class), tương tự với các ngôn ngữ hướng đối tượng còn lại, chẳng hạn như JavaScript, để định nghĩa một lớp theo ES6 (ECMAScript – một tiêu chuẩn cho ngôn ngữ lập trình JavaScript). Cách thức ban đầu được gọi khi khởi tạo đối tượng là _init_; trong Java nó sẽ được tạo mặc định hoặc được khai báo; trong JavaScript nó theo cơ chế dựa trên nguyên mẫu, trong đó cơ chế đối tượng gốc sẽ được gọi hoặc được thực hiện vì nó có cơ chế kế thừa nguyên mẫu.
Cơ chế kế thừa tồn tại trong Python tương tự với các ngôn ngữ khác như C++, Java,…
Python thường mất nhiều thời gian hơn Java dẫn đến việc thực thi các chương trình chậm hơn. Tuy nhiên, Python lại có thể viết chương trình dễ dàng hơn so với các ngôn ngữ lập trình hướng đối tượng khác vì cú pháp (syntax) dễ sử dụng hơn và ngắn hơn.
Python cũng có thể tích hợp với các ngôn ngữ lập trình hướng đối tượng khác như Java để phát triển các ứng dụng bằng cả hai ngôn ngữ, điều này có thể giúp ích cho các chức năng trong chương trình và cả hai có thể gọi nhau để thực thi ứng dụng.
Sự khác biệt giữa ngôn ngữ lập trình hướng đối tượng (Object-Oriented) và không hướng đối tượng (Non-Object Oriented)
Ngôn ngữ lập trình hướng đối tượng có các tính năng mạnh để phát triển các ứng dụng kịch bản trong thế giới thực, trong khi đó ngôn ngữ lập trình không hướng đối tượng như ngôn ngữ thủ tục có các tính năng bị hạn chế liên quan đến các ứng dụng thời gian thực.
Lập trình hướng đối tượng tiếp cận theo cách từ dưới lên còn lập trình không hướng đối tượng thì tiếp cận theo cách từ trên xuống. Các tính năng lập trình sẽ được chia thành các phương thức hoặc đối tượng, trong khi đó lập trình không hướng đối tượng định nghĩa các chức năng như một đoạn mã để thực thi các hoạt động. Lập trình hướng đối tượng có thể thực hiện việc ẩn dữ liệu nhưng trong lập trình không hướng đối tượng thì không. Tính kế thừa và tính trừu tượng là những tính năng mạnh mẽ có trong lập trình hướng đối tượng, những tính năng này không tồn tại trong lập trình không hướng đối tượng.
Tiếp đó trong lập trình hướng đối tượng cho phép nạp chồng toán tử, ngược lại nó không được cho phép trong lập trình không hướng đối tượng. Ví dụ về các ngôn ngữ lập trình không hướng đối tượng như là Pascal, Fortran, …
Kết luận
Các đặc tính hướng đối tượng của một ngôn ngữ lập trình cung cấp nhiều tính năng phong phú trong việc phát triển các ứng dụng phức tạp với quy mô lớn, cho phép vận hành các doanh nghiệp trong thế giới kỹ thuật số hiện nay với nhu cầu về lượng dữ liệu và khách hàng ngày càng tăng. Kết luận lại cho câu hỏi “Python có phải là một ngôn ngữ lập trình hướng đối tượng hay không?”, chúng tôi cần cho bạn biết rằng Python có thể được sử dụng để phát triển các ứng dụng web bằng cách sử dụng một framework có tên là Django, framework này cung cấp hầu hết các triển khai để dễ dàng phát triển web; vì vậy, Python là ngôn ngữ lập trình hướng đối tượng.
Bên cạnh đó, cũng có các framework khác được sử dụng trong ngôn ngữ Python để phát triển các loại ứng dụng khác nhau tùy theo từng yêu cầu khác nhau. Python cũng có các tính năng khác như chức năng (Functional), thủ tục (Procedural), Phản xạ (Reflective), mệnh lệnh (Imperative), v.v., bên cạnh tính năng hướng đối tượng.Ngoài ứng dụng như một ngôn ngữ lập trình hướng đối tượng (OOP), Python cũng được ứng dụng trong các lĩnh vực khác như Networking, Web frameworks, Graphical User Interfaces, Databases, Automation, v.v.(Imperative), v.v., bên cạnh tính năng hướng đối tượng.
Thảo luận
Nếu bạn có bất kỳ khó khăn hay thắc mắc gì về khóa học, đừng ngần ngại đặt câu hỏi trong phần bên dưới hoặc trong mục HỎI & ĐÁP trên thư viện Howkteam.com để nhận được sự hỗ trợ từ cộng đồng.
Cảm ơn các bạn đã luôn đồng hành cùng Kteam. Hãy để lại bình luận hoặc góp ý của mình để phát triển bài viết tốt hơn. Đừng quên “Luyện tập – Thử Thách – Không ngại khó”
Tham gia miễn phí khóa học Lập trình Hướng Đối Tượng với Python
Tác giả/Dịch giả
Đánh giá
Bình luận
ad cho em hỏi , khi mình viết def_init_ 1 lần rồi thì các hàm phía dưới ko cần gọi nũa ạ
Mình mới tìm hiểu về python qua howkteam. Mình muốn sử dụng python để giao tiếp với các thiết bị ngoại vi thì nên tìm hiểu theo hướng nào? thanks
cho em hỏi lớp abtract và interface khác nhau chỗ nào khi nào dùng abtract khi nào cũng interface với ạ
OOP với python
Bài đăng này đã không được cập nhật trong 3 năm
Như bài trước thì mình đã đi tìm hiểu qua cơ bản về biến và kiểu dữ liệu trong python. Nếu bạn nào chưa xem thì xem tại đây. Còn phần này mình sẽ đi qua về OOP (Object Oriented Programming) trong python. Let’s go.
Khái niệm
Python là một ngôn ngữ hướng đối tượng. Vì vậy hầu hết mọi thứ trong Python đều là những đối tượng với những thuộc tính (properties) và phương thức (methods).
OOP là một kĩ thuật lập trình cho phép tạo ra các đối tượng để trừu tượng hóa 1 đối tượng thực tế (đưa các đối tượng trong thực tế vào trong code). Cho phép lập trình viên tương tác với các đối tượng này.
Một đối tượng bao gồm: thuộc tính (attributes) và phương thức (methods).
- Thuộc tính (attributes) chính là những thông tin, đặc điểm của đối tượng. VD: Con mèo (màu sắc, có đuôi, 2 tai, bốn chân, …)
- Phương thức (methods) là những thao tác, hành động mà đối tượng đó có thể thực hiện. VD: Con mèo (ăn, chạy nhảy, cắn, gào, rên, ….)
Lớp có thể hiểu là một bản thiết kế để tạo ra một thực thể nào đó, là tập hợp nhiều thuộc tính đặc trưng cho đối tượng được tạo ra từ lớp này. VD: Con mèo (tên, màu sắc, có đuôi, tai, chân, …)
Đối tượng là một thực thể của 1 lớp nào đó, được tạo ra từ lớp đó. VD: Mèo mun (tên là mèo mun, màu đen, có đuôi dài, 2 tai, 4 chân, ….)
OOP tuân theo một số nguyên lý cơ bản, gồm có 4 nguyên lý: TÍnh đóng gói, Tính kế thừa, TÍnh bao đóng, Tính đa hình.
Các nguyên lý cơ bản của OOP
- Tính đóng gói (Encapsulation): Các dữ liệu và phương thức có liên quan với nhau được đóng gói thành 1 lớp. Tức là mỗi lớp được xây dựng để thực hiện một nhóm chức năng đặc trưng của riêng lớp đó. Che giấu các thông tin của lớp đó đối với bên ngoài thể hiện ở public, protected, private đối với từng thuộc tính và phương thức.
- TÍnh kế thừa (Inheritance): Nguyên tắc này cho phép xây dựng một lớp mới dựa trên 1 lớp đã khai báo từ trước. Lớp con có thể sử dụng lại các thuộc tính và phương thức của lớp cha mà không cần khai báo lại. Tùy thuộc vào từng ngôn ngữ cho phép việc kế thừa 1 hoặc nhiều class cha.
- TÍnh trừu tượng (Abstraction): tổng quát hóa phương thức của đối tượng không quan tâm phương thức thực hiện như thế nào, được thể hiện bởi interface (có các tên phương thức nhưng ko có body của phương thức, khi class nào impliment interface thì thực hiện nó).
- Tính đa hình (Polymorphism): Tính đa hình được thể hiện bởi một phương thức, hành động có thể thực hiện theo nhiều cách khác nhau. VD: chó mèo cùng là động vật nhưng khi thực hiện phương thức ‘sủa’ thì chó sủa ‘gogo’, mèo sủa ‘méo mèo’. =)
Python là một ngôn ngữ hướng đối tượng nên cũng tuân theo các nguyên lý cơ bản của OOP.
Class, methods, attributes
-Trong python có nhiều lớp đã được định nghĩa sẵn. Do mọi thứ trong python đều là đối tượng ví dụ như list, tuple, dictionary, string, int… là các lớp. Khi chúng ta khai báo biến thuộc các lớp này thì chúng là các đối tượng, nếu các bạn không tin thì có thể sử dụng hàm
type()
Ngoài các class có sẵn thì chúng ta có thể định nghĩa ra các lớp riêng biệt sử dụng từ khóa class:
class helloWorld: pass hl = helloWorld() print type(helloWorld) print type(hl)
Trong ví dụ trên chúng ta đã tạo một đối tượng mới là hl nên type của nó là instant – 1 thể hiện của lớp helloWorld, còn helloWorld là một lớp – class. Bên trong lớp pass – cú pháp cho việc chưa biết nên xây dựng nó như thế nào, chưa biết nên code sao cho tối ưu và muốn để lại làm sau. Nhưng hàm, lệnh đó không thể có một khối lệnh rỗng, trình biên dịch sẽ báo lỗi, vì thế, chỉ cần sử dụng lệnh pass để xây dựng một khối lệnh rỗng, lúc này trình biên dịch sẽ hiểu và bỏ qua. Thay thế cho pass chúng ta có thể khai báo các thuộc tính và phương thức ở đây.
-Thuộc tính có thể hiểu là một biến trong class, thuộc tính mô tả các đặc tính của một đối tượng. Trong Python có một phương thức đặc biệt gọi là
__init__()
dùng để khởi tạo giá trị cho các thuộc tính của một đối tượng.
class dog: legs = 4; def __init__(self, name): self.name = name pug = dog('bug') print pug.name print pug.legs husky = dog('husky') print husky.name print husky.legs
Phương thức
__init__()
là phương thức khởi tạo của tất cả các lớp, mỗi khi tạo một đối tượng phương thức này sẽ tự động được gọi. Bất cứ phương thức nào của Python cũng đều phải có tham số đầu tiên là self rồi mới đến các tham số khác. self ám chỉ đối tượng đã được gọi đó. Chẳng hạn trong ví dụ trên khi chúng ta gọi pug = dog(‘bug’) thì self chính là đối tượng pug.
Ngoài những thuộc tính phải khai báo khi tạo 1 đối tượng mới thì chúng ta có thể khai báo các thuộc tính có sẵn với mọi class được tạo ra và ko cần phải gán khi khai báo. VD: legs
-Phương thức thực chất là các các hàm trong class, thực hiện các công việc cụ thể:
class dog: legs = 4; def __init__(self, name): self.name = name def eat(self): print 'an an an ....' pug = dog('bug') print pug.name print pug.legs pug.eat()
Các phương thức có sẵn được kế thừa từ lớp gốc – magic method
-Phương thức
__init__()
như trên đã trình bày, khởi tạo các tham số, thuộc tính của class
-Ngoài ra còn có
__repr__()
,
__str__()
,
__del__()
,
__format__()
,
__bytes__()
,
__hash__()
,
__len__()
,
__add__()
,
__call__()
, … Hiểu thêm về magic method ở đây
Tính bao đóng
Về bản chất trong python thì các khái niệm về private, protected, public không có, trong code chúng ta chỉ ám chỉ điều này cho việc truy cập cho đúng:
- với public thì có thể truy cập được ở mọi nơi, nên cách khai báo như hàm bình thường
- Với protected thì chỉ lớp con có thể truy cập được, cách khai báo bằng cách bắt đầu bằng một dấu gạch ngang “_”, VD: _age. Chúng ta sẽ ngầm hiểu là ko sử dụng nếu không phải là class con
- Với private thì chỉ class đó có quyền truy cập, cách khai báo bằng cách bắt đầu bằng 2 dấu gạch ngang “__”, VD: __age.
class Foo: __name = "Foo" def __getName(self): print(self.__name) def get(self): self.__getName() print(Foo().__name) #error Foo().__getName() #error Foo().get()
Kế thừa trong python
-Cú pháp kế thừa:
class childClass(baseClass):
class Animal: legs = '0' def __init__(self): pass def whoAmI(self): print ("Animal") def eat(self): print ("Eating") class Dog(Animal): def __init__(self): Animal.__init__(self) print ("Dog created") self.legs = '4'; def whoAmI(self): print ("Dog go go") def eat(self): print ("eat eat eat .....") def run(self): print ("legs: " + self.legs + " run run run .....") d = Dog() d.whoAmI() d.eat() d.run()
Trong ví dụ trên chúng ta định nghĩa hai lớp là là Animal và lớp Dog. Lớp Dog kế thừa từ lớp Animal, sử dụng lại một số phương thức, thuộc tính của lớp Animal và có các phương thức của riêng nó. Ở trên lớp Dog kế thừa phương thức eat(), kế thừa và thay đổi phương thức whoAmI(), ngoài ra lớp Dog còn có phương thức của riêng nó là phương thức run(). Ta có thể thấy lớp dog đã sử dụng lại thuộc tính legs và thay đổi giá trị của thuộc tính này là 4.
Để kế thừa một lớp thì chúng ta đặt tên lớp đó bên trong cặp dấu ngoặc tròn () ngay phía sau phần định nghĩa tên lớp. Như ví dụ trên là đơn kế thừa – kế thừa từ một class. Trong python thì chúng ta có thể đa kế thừa – cho phép từ 1 class con có thể kế thừa từ nhiều class cha.
class Animal: legs = '0' def __init__(self): pass def whoAmI(self): print ("Animal") def eat(self): print ("Eating") class Entity: def __init__(self): pass def weight(self): print 'weight 88'; class Dog(Entity, Animal): def __init__(self): Animal.__init__(self) Entity.__init__(self) print ("Dog created") self.legs = '4'; def whoAmI(self): print ("Dog go go") def eat(self): print ("eat eat eat .....") def run(self): print ("legs: " + self.legs + " run run run .....") d = Dog() d.whoAmI() d.eat() d.run() d.weight()
Ở ví dụ trên thì lớp Dog đã kế thừa từ 2 lớp cha là Animal và Entity.
Interface, abstract class
-abstract class: Các Abstract class cho phép bạn cung cấp chức năng mặc định cho các class con. Bằng cách định nghĩa một abstract base class (lớp cơ sở trừu tượng), bạn có thể xây dựng nên một mô hình chung cho một nhóm các class con. Mặc định trong Python sẽ không cung cấp Abstract class cho chúng ta sử dụng. Nhưng Python có một mô-đun gọi là Abstract Base Classes (ABC) để giúp chúng ta làm điều đó. Mô-đun này nằm trong package abc nên chúng ta cần import vào trước khi sử dụng.
from abc import ABC
-Từ khóa @ abstractmethod: để khai báo rằng phương thức phía dưới là phương thức abstract
form abc import ABC, abstractmethod # abstract class class abstractClassName(ABC): @abstractmethod def methodName(self): pass # tạo class implement từ abstractClassName class normalClass(abstractClassName): # khai báo thuộc tính, phương thức class ở đây def methodName(self): pass
-Interface: Trong python không biết có đúng không nhưng thấy ít tài liệu nói về cái này trong python, có ý nói rằng interface thực sự không cần thiết bởi vì trong python có đa kế thừa. Nhưng bạn vẫn có thể tạo Interface từ lớp ABC tương tự ở trên.
form abc import ABC, abstractmethod class InformalParserInterface: @abstractmethod def load_data_source(self): pass def extract_text(self): pass
Bài này cũng dài rồi, mình chỉ đi qua các phần cơ bản của OOP còn chi tiết chắc cần tìm hiểu từng phần và kĩ hơn. Cảm ơn bạn đã quan tâm
All rights reserved
Đăng nhập/Đăng ký
Danh sách bài
Bài 1. Tổng quan về lập trình Python
Tổng quan
Bài 2. Giới thiệu về lập trình Python
Giới thiệu
Từ khóa & Định danh
Câu lệnh & Bình luận
Biến & Hằng số
Kiểu dữ liệu
Ép kiểu
Nhập/Xuất & Import dữ liệu
Toán tử
Namspace & Phạm vi
Bài 3. Điều khiển luồng trong Python
if…else
for
while
break & continue
pass
Bài 4. Hàm trong Python
Hàm
Hàm tư định nghĩa
Đối số của hàm
Đệ quy
Hàm ẩn danh/lambda
Phạm vi của biến
Từ khóa global
Module
Package
Bài 5. Kiểu dữ liệu trong Python
Kiểu dữ liệu số
Danh sách
Tuple
Chuỗi
Set
Dictionary
Bài 6. Làm việc với File trong Python
File I/O
Quản lý tệp và thư mục
Ngoại lệ
Xử lý ngoại lệ
Ngoại lệ tự định nghĩa
Bài 7. Đối tượng và Lớp trong Python
Lập trình hướng đối tượng
Đối tượng & lớp
Kế thừa
Đa kế thừa
Nạp chồng toán tử
Bài 8. Các chủ đề nâng cao trong Python
Iterator
Generator
Closure
Decorator
Property
RegEx
Tổng hợp ví dụ
Bài 9. Xử lý Ngày giờ trong Python
Datetime
datetime.strftime()
datetime.strptime()
Lấy ngày và giờ hiện tại
Lấy thời gian hiện tại
Chuyển timestamp thành datetime và ngược lại
Module time
time.sleep()
Tutorial
Python Tutorial
Trang trước
Trang tiếp theo
Bạn cần
đăng nhập
để bình luận bài viết này
Chưa có bình luận nào, hãy là người đầu tiên bình luận
Chia sẻ kiến thức – Kết nối tương lai
Về chúng tôi
Về chúng tôi
Giới thiệu
Chính sách bảo mật
Điều khoản dịch vụ
Học miễn phí
Học miễn phí
Khóa học
Luyện tập
Cộng đồng
Cộng đồng
Kiến thức
Tin tức
Hỏi đáp
CÔNG TY CỔ PHẦN CÔNG NGHỆ GIÁO DỤC VÀ DỊCH VỤ BRONTOBYTE
The Manor Central Park, đường Nguyễn Xiển, phường Đại Kim, quận Hoàng Mai, TP. Hà Nội
THÔNG TIN LIÊN HỆ
[email protected]
©2024 TEK4.VN
Copyright © 2024
TEK4.VN
Giới thiệu lập trình hướng đối tượng OOPs trong Python. Python là một ngôn ngữ lập trình hướng đối tượng. Nó cho phép chúng ta phát triển các ứng dụng bằng cách sử dụng phương pháp hướng đối tượng. Trong Python, chúng ta có thể dễ dàng tạo và sử dụng các lớp và các đối tượng.
Các nguyên tắc chính của hệ thống lập trình hướng đối tượng được đưa ra dưới đây.
Nội dung chính
Các khái niệm OOPs trong Python
- Đối tượng (object)
- Lớp (class)
- Phương thức (method)
- Kế thừa
- Đa hình
- Trừu tượng
- Đóng gói
Lập trình hướng đối tượng có 4 tính chất:
Đối tượng (object)
Đối tượng là một thực thể có trạng thái và hành vi. Nó có thể là bất kỳ đối tượng trong thế giới thực như chuột, bàn phím, ghế, bàn, bút, v.v.
Mọi thứ trong Python là một đối tượng và hầu hết mọi thứ đều có thuộc tính và phương thức. Tất cả các hàm đều có thuộc tính __doc__ tích hợp, trả về chuỗi doc được xác định trong mã nguồn của hàm.
Lớp (class)
Lớp có thể được định nghĩa là một tập hợp các đối tượng. Nó là một thực thể logic có một số thuộc tính và phương thức cụ thể. Ví dụ: nếu bạn có một lớp nhân viên thì nó phải chứa một thuộc tính và phương thức, tức là một địa chỉ, tên, tuổi, lương, v.v.
Phương thức
Phương thức là một hàm được liên kết với một đối tượng. Trong Python, một phương thức không phải là duy nhất cho các thể hiện của lớp. Bất kỳ kiểu đối tượng nào cũng có thể có phương thức.
Kế thừa (Inheritance)
Kế thừa là khía cạnh quan trọng nhất của lập trình hướng đối tượng, mô phỏng khái niệm thừa kế trong thế giới thực. Nó xác định rằng đối tượng con có được tất cả các thuộc tính và hành vi của đối tượng cha.
Bằng cách sử dụng tính kế thừa, chúng ta có thể tạo một lớp sử dụng tất cả các thuộc tính và hành vi của lớp khác. Lớp mới được biết đến như là một lớp dẫn xuất hoặc lớp con và lớp còn lại gọi là lớp cơ sở hoặc lớp cha.
Kế thừa giúp tái sử dụng lại mã nguồn.
Đa hình (Polymorphism)
Đa hình chứa hai từ “poly” và “morphs”. Poly có nghĩa là nhiều và Morphs có nghĩa là hình thức, hình dạng. Bằng đa hình, chúng ta hiểu rằng một nhiệm vụ có thể được thực hiện theo những cách khác nhau. Ví dụ: Bạn có một lớp động vât và tất cả các con vật đều biết kêu. Nhưng chúng kêu khác nhau. Ở đây, hành vi “kêu” là đa hình theo nghĩa và phụ thuộc vào động vật. Vì vậy, khái niệm “động vật” trừu tượng không thực sự “nói”, nhưng các động vật cụ thể (như chó và mèo) có một triển khai cụ thể của hành động “kêu”.
Đóng gói (Encapsulation)
Đóng gói cũng là một khía cạnh quan trọng của lập trình hướng đối tượng. Nó được sử dụng để hạn chế quyền truy cập vào các phương thức và biến. Trong đóng gói, mã và dữ liệu được gói cùng nhau trong một đơn vị.
Trừu tượng (Abstraction)
Trừu tượng hóa dữ liệu và đóng gói cả hai thường được sử dụng như từ đồng nghĩa. Cả hai đều gần như đồng nghĩa vì sự trừu tượng hóa dữ liệu đạt được thông qua việc đóng gói.
Trừu tượng được sử dụng để ẩn chi tiết nội bộ và chỉ hiển thị các chức năng. Trừu tượng hóa một cái gì đó có nghĩa là đặt tên cho những thứ để cái tên nắm bắt cốt lõi của những gì một chức năng hoặc toàn bộ chương trình làm.
Có thể bạn quan tâm
Lập Trình Hướng Đối Tượng trong Python
Bài đăng này đã không được cập nhật trong 2 năm
Chào các bạn Trong bài này, bạn sẽ tìm hiểu về Lập trình hướng đối tượng (OOP) bằng Python và khái niệm cơ bản của nó và một số các ví dụ. Các bạn cùng tìm hiểu trong bài viết của mình nhé!
Lập trình hướng đối tượng
Python là một ngôn ngữ lập trình đa mô hình. Nó hỗ trợ các cách tiếp cận lập trình khác nhau. Một trong những cách tiếp cận phổ biến để giải quyết vấn đề lập trình là tạo các đối tượng. Điều này được gọi là Lập trình hướng đối tượng (OOP).
Một đối tượng sẽ có hai đặc điểm:
- Thuộc tính
- Hành vi
Mình có 1 ví dụ :
Một con vẹt có thể là một đối tượng, vì nó có các đặc tính sau:
- Tên, tuổi, màu sắc thì sẽ là thuộc tính
- chạy nhảy, hỏi hoặc hót thì sẽ là hành vi
Trong Python, khái niệm OOP tuân theo một số nguyên tắc cơ bản như sau:
Lớp (Class)
Một lớp là một bản thiết kế cho đối tượng.Với ví dụ con Vẹt ở trên thì chúng ta có thể hình dung
class
sẽ như một bản phác thảo về con Vẹt. Nó sẽ chứa tất cả các chi tiết về tên, màu sắc v.v. Về con Vẹt.
Ví dụ về
class
:
class Parrot: pass
Ta dùng từ khóa
class
để định nghĩa cho 1 class
Parrot
. Từ
class
bạn có để định nghĩa các thuộc tính chi tiết để mô tả về
Parrot
.
Đối tượng (Object)
Một đối tượng) là một khởi tạo của một lớp. Khi lớp được định nghĩa nó sẽ là mô tả cho một đối tượng đước xác định.
Ở đây
obj
là một đối tượng của lớp
Parrot
.
Bây giờ, chúng ta sẽ bắt đầu xây dựng lớp và các đối tượng của
Parrot
.
Tạo lớp và đối tượng trong Python
class Parrot: # class attribute species = "bird" # instance attribute def __init__(self, name, age): self.name = name self.age = age # instantiate the Parrot class blu = Parrot("Blu", 10) woo = Parrot("Woo", 15) # access the class attributes print("Blu is a {}".format(blu.__class__.species)) print("Woo is also a {}".format(woo.__class__.species)) # access the instance attributes print("{} is {} years old".format( blu.name, blu.age)) print("{} is {} years old".format( woo.name, woo.age))
Giá trị hiển thị :
Blu is a bird Woo is also a bird Blu is 10 years old Woo is 15 years old
Trong chương trình trên, chúng ta đã tạo một lớp với tên Parrot. Sau đó, chúng ta xác định các thuộc tính. Các thuộc tính là một đặc tính của một đối tượng.
Các thuộc tính này được định nghĩa bên trong phương thức
__init__
của lớp. Đây là phương thức khởi tạo được chạy đầu tiên ngay sau khi đối tượng được tạo.
Tiếp đó chúng ta tạo các instances cho lớp
parrot
. Với ví dụ ở trên thì
blu
và
woo
sẽ là các trá trị để tham chiếu đến đối tượng.
Ta có thể truy cập thuộc tính class bằng cách sử dụng
__class__.species
. Tương tự ta cũng có thể truy cập các thuộc tính của instance bằng các sử dụng
blu.name
và
blu.age
Phương thức (Methods)
Các phương thức là các hàm được định nghĩa bên trong phần thân của một lớp. Chúng được sử dụng để xác định các hành vi của một đối tượng.
Tạo phương thức trong Python
class Parrot: # instance attributes def __init__(self, name, age): self.name = name self.age = age # instance method def sing(self, song): return "{} sings {}".format(self.name, song) def dance(self): return "{} is now dancing".format(self.name) # instantiate the object blu = Parrot("Blu", 10) # call our instance methods print(blu.sing("'Happy'")) print(blu.dance())
Giá trị hiển thị :
Blu sings 'Happy' Blu is now dancing
Với ví dụ trên. Ta đã sác định được 2 phương thức là
sing()
và
dance()
. chúng chính là phương thức cho đối tượng
blu
Kế Thừa (Inheritance)
Kế thừa là một cách tạo một lớp mới để sử dụng các thuộc tính của một lớp hiện có mà không cần sửa đổi nó. Lớp mới được hình thành là một lớp dẫn xuất (hoặc lớp con). Tương tự, lớp hiện có là một lớp cơ sở (hoặc lớp cha).
Sử dụng Kế thừa trong Python
# parent class class Bird: def __init__(self): print("Bird is ready") def whoisThis(self): print("Bird") def swim(self): print("Swim faster") # child class class Penguin(Bird): def __init__(self): # call super() function super().__init__() print("Penguin is ready") def whoisThis(self): print("Penguin") def run(self): print("Run faster") peggy = Penguin() peggy.whoisThis() peggy.swim() peggy.run()
Giá trị hiển thị :
Bird is ready Penguin is ready Penguin Swim faster Run faster
Ở ví dụ trên ta tạo ra 2 lớp là
Bird
(là lớp cha) và
Penguin
(là lớp con). Ở đây lớp con sẽ kế thừa các chức năng và thuộc tính của lớp cha. Ở ví dụ trên đứng từ lớp con ta có thể gọi phương thức
swim()
từ lớp cha
Tiếp đó ví dụ trên ta đã có thể sửa đổi hành vi của lớp cha là phương thức
whoisThis()
. Hơn thế nữa ta có thể extend chức năng của lớp cha bằng cách tạo ra một phương thức
run()
Ngoài ra, ta sử dụng hàm
super ()
bên trong phương thức
__init __ ()
. Điều này cho phép chúng ta chạy phương thức
__init __ ()
của lớp cha bên trong lớp con.
Đóng gói (Encapsulation)
Sử dụng OOP trong Python, ta có thể hạn chế quyền truy cập vào các phương thức và biến. Điều này ngăn dữ liệu khỏi sửa đổi trực tiếp đây có thể gọi là Đóng Gói. Trong Python, ta biểu thị các thuộc tính riêng tư bằng cách sử dụng dấu gạch dưới làm tiền tố, sử dụng hoặc
__
Đóng gói dữ liệu trong Python
class Computer: def __init__(self): self.__maxprice = 900 def sell(self): print("Selling Price: {}".format(self.__maxprice)) def setMaxPrice(self, price): self.__maxprice = price c = Computer() c.sell() # change the price c.__maxprice = 1000 c.sell() # using setter function c.setMaxPrice(1000) c.sell()
Giá trị hiển thị :
Selling Price: 900 Selling Price: 900 Selling Price: 1000
Ở ví dụ trên ta đã định nghĩa một lớp
computer
. Ta sử dụng phương thức
__init__()
để set giá cho
computer
. Ta đã thử sửa lại giá. Tuy nhiên sẽ không thể tahy đổi được giá vì trong Python
__maxprice
là một thuộc tính private.
Vì vậy để thay đổi giá ta cần sử dụng một mà
setMaxPrice
để lấy price làm tham số.
Tính đa hình (Polymorphism)
Tính đa hình trong OOP sử dụng một giao diện chung cho nhiều kiểu dữ liệu.
Giả sử, chúng ta cần tô màu cho một vật , có nhiều tùy chọn hình dạng (hình chữ nhật, hình vuông, hình tròn). Tuy nhiên, chúng ta có thể sử dụng cùng một phương pháp để tô màu bất kỳ hình dạng nào. Khái niệm này được gọi là Đa hình.
Sử dụng tính đa hình trong Python
class Parrot: def fly(self): print("Parrot can fly") def swim(self): print("Parrot can't swim") class Penguin: def fly(self): print("Penguin can't fly") def swim(self): print("Penguin can swim") # common interface def flying_test(bird): bird.fly() #instantiate objects blu = Parrot() peggy = Penguin() # passing the object flying_test(blu) flying_test(peggy)
Giá trị hiển thị :
Parrot can fly Penguin can't fly
Ở ví dụ ta đã định nghĩa 2 lớp
Parrot
và
Penguin
. Mỗi lớp đều có phương thức chung là
fly()
. Tuy nhiên chức năng thì sẽ khác nhau.
Để sử dụng tính đa hình. Ta tạo một hàm
fly_test()
nhận bất kì đối tượng là và gọi vào phương thức
fly()
của đối tượng đó. Vì vậy khi ta chuyển các đối tượng
blu
và
peggy
thì hàm sử dụng được và trả ra kết quả.
Kết Luận
Dưới đây mình đã giới thiệu với các bạn về Lập Trình Hướng Đối Tương và các ví dụ cụ thể Nếu có bất kì thắc mắc gì hãy để lại comment ở phía dưới nhé.
Tham Khảo chi tiết hơn
https://www.programiz.com/python-programming/object-oriented-programming
All rights reserved
Lập trình Hướng Đối Tượng với Python
Danh sách bài học
Keywords searched by users: lập trình hướng đối tượng python
Categories: Có được 27 Lập Trình Hướng Đối Tượng Python
See more here: kientrucannam.vn
See more: https://kientrucannam.vn/vn/