What is OOP?
Thinking in sequences
Mỗi ngày bạn đều thức dậy -> ăn sáng -> đi làm.
Góc nhìn về việc lặp lại có tuần tự này sẽ rất tuyệt vời nếu bạn cố gắng lập kế cho ngày của mình. Nhưng nếu bạn đang sống giữa thành thị, kế hoạch hay thói quen này có vẻ sẽ không ổn. Và để vạch ra một chuỗi các hành động cho nhiều cá nhân thì sẽ không mô tả hết được và thiếu bền vững. Thay vào đó, hãy bắt đầu nghĩ về pattern của tất cả hành vi, thói quen.
Điều tương tự cũng diễn ra với coding. Càng sử dụng nhiều dữ liệu, và chứa nhiều chức năng, thì thật khó để diễn giải nó chỉ bằng một chuỗi các bước. Thay vào đó, hãy xem nó như một tập hợp của đối tượng và các patterns tương tác của chúng. Quan điểm này đã trở thành tiêu chí quan trọng nhất khi thiết kế các framworks hay các application mà hiện nay chúng ta đang sử dụng. Nó giúp tổ chức code được tốt hơn, dễ tái sử dụng và maintainable.
Object as data structures
Khái niệm cơ bản của OOP là các objects và classes.
Object là một cấu trúc dữ liệu kết hợp thông tin về state và behavior , ví dụ như một đối tượng đại diện cho customer có thể có một số điện thoại nhất định, địa chỉ email được liên kết (các state), và các hành vi như order hoặc hủy order (behavior) . Đặc điểm nổi bật của OOP là cả state và behavior được kết hợp với nhau thay vì các dữ liệu của khách hàng tách biệt với hành động của họ, chúng được đóng gói (Encapsulation) và được coi như một unit đại điện cho khách hàng.
Sức mạnh thực sự của OOP đến từ việc sử dụng các classes. Class được xem như một bản thiết kế chi tiết, giúp mô tả các state và behavior có trong một object.
Lúc này một đói tượng khách hàng cụ thể chỉ như một classes với các state và behavior cụ thể.
Objects in Python.
Các state được chứa trong các attributes và các thông tin behavior được chứa trong methods.
Các attributes (state) được đại diện bởi các biến (variables) như là numbers, string, or tuples,... . Các methods (behavior) được đại diện vởi các functions. Cả hai đều được truy cập từ object bằng cách sử dụng cú pháp .
. Bạn có thể list tất cả các attributes và methods bằng cách call dir()
.
Class: Attributes and methods.
- Khởi tạo một class cơ bản
class Customer:
# code for class goes here
pass
c1 = Customer()
c2 = Customer()
(Sử dụng pass để tạo một "empty" class)
- Define một methods
class Customer:
def identify(self, name):
print("I am customer " + name)
cust = Customer()
cust.identify("Dude")
- Method definition = function definition within class
use self
như một argument đầu tiên trong method. Tất cả method đều sẽ có first argument này và chúng không cần thêm vào khi gọi method.
What is self
:
Các đối tượng của một class chưa tồn tại khi một class đang được định nghĩa, nhưng chúng ta cần một cách để tham chiếu đến dữ liệu của đối tượng cụ thể trong định nghĩa của class - Đó chính là mục đích của
self
. Nó như là một chỗ dựa (stand-in) cho đối tượng ở tương lai, và sử dụng nó để truy cập các thuộctính và gọi các phương thức khác từ bên trong định nghĩa của class ngay cả khi chưa có đối tượng (object) nào được tạo.
Python sẽ tự xử lý khi method được gọi từ một object:
cust.identify("Laura"
) sẽ được thông dịch như làCustomer.identity(cust, "Laura")
We need attributes
Theo nguyên tắc đóng gói (Encapsulation) , dữ liệu mô tả state của đối tượng nên được gộp chung vào đối tượng. Ví dụ: Customer
name nên là một attribute chứ không phải là một tham số được truyền cho một method.
class Customer:
# set the name attribute of an object to new_name
def set_name(self, new_name):
# Create an attribute by assigning a value
self.name = new_name # <-- will create .name when set_name is called
# Using .name from the object itself*
def identify(self):
print("I am Customer" + self.name)
Constructor
Việc tạo nhiều attribute và method để add các dữ liệu vào sẽ làm cho Object thiếu bền vững, hơn thế nữa sẽ làm bạn tốn nhiều thời gian để định nghĩa một Object. Python có constructor __init__()
sẽ luôn được call tự động mỗi khi object được tạo.
class Customer:
def __init__(self, name, balance=0):
self.name = name # <--- Create the name attribute and set it to name parameter
self.balance = balance
print("The __init__ method was called")
cust = Customer("Hê he")
print(cust.name)
Init constructor cũng là nơi tuyệt vời để set các default values cho các attributes.
Việc tạo init constructor cũng sẽ làm cho việc nhận biết các attribute được dễ dàng hơn, và các attribute được khởi tạo khi object được tạo nên sẽ không lo về việc truy cập các attribute không tồn tại. Chung quy lại là giúp tổ chức code, dễ đọc, và có tính maintainable.
Best practices:
Initialize attributes in
__init__()
Naming
CamelCase
for classes,lower_snake_case
for function and attributes.Bạn có thể sử dụng một tên khác thay cho tên gọi
self
, Nhưng tuyệt đối đừng nên làm như vậy, hãy luôn để nó làself
Use docstrings
class MyClass: """ This class does nothing""" pass
End.
Và đấy là tất cả những gì mình học được trên datacamp . Mọi ví dụ mình cũng lấy ở trên khóa học này, bạn có thể tham khảo tại đây (có vài bài tập thú vị nữa).
Tâm sự chút: Hôm này là International Men's Day mà sao thấy đường phố chỗ mình vắng hoe à, chả hiểu sao? Mà cái ngày cứt gà này bắt nguồn từ đâu nhỉ, thấy bullshit thật, mọi năm chả thấy ai hưởng ứng cái mọe này.
p.