01/10/2018, 11:13

Lập trình hướng đối tượng trong python

Chào mọi người, em đang học cuốn “Lear python the hard way”, nhưng đến bài 43 học về lập trình hướng đối tượng em thấy khó hiểu quá, nghiền ngẫm mãi mà không hiểu cách làm việc của đoạn code này(Em là người mới học lập trình), mong mọi người giải ngố hộ em cái. Em cảm ơn!

Henry viết 13:29 ngày 01/10/2018

Bạn chắc chắn hiểu rõ được hướng đối tượng chưa? Nếu chưa thì bài này hơi ngộp so với bạn đấy. Mà nếu chưa rõ mà người khác giải thích thì đôi khi bạn cũng không hiểu gì. Còn nếu bạn hiểu mấy cái như __init__, rồi sử dụng phương thức thì vô tư hiểu. Xưa mình bỏ luôn bài này. Giờ mình đi coi code bài này đây. Nếu bạn có hứng thú, mình sẽ giải thích

Lê Thành Công viết 13:24 ngày 01/10/2018

Bạn giải thích cách hoạt động của đoạn code đó dùm mình với. Mình thấy hơi lằng nhằng.

Henry viết 13:19 ngày 01/10/2018

Đầu tiên là nói tới lớp Map. Bạn khởi tạo một đối tượng thuộc lớp Map đó là a_map. Giờ hãy xem coi đối tượng này có cái gì.

Xét đối tượng a_map

Khi vào hàm __init__ nó được đặt một cái thuộc tính là start_scene với giá trị là là một chuỗi, đó chính là 'central_corridor". Nhớ để ý chuỗi này, tí nữa sẽ liên quan tới đấy. Vậy thôi, đối tượng a_map của lớp Map chỉ có thế.


Tiếp theo là đối tượng a_game của lớp Engine

Xét đối tượng a_game

khởi tạo đối tượng này với một thuộc tính đó là scene_map và giá trị của nó là? Là một đối tượng của lớp Map cụ thể đó chính là đối tượng a_map. Rồi chỉ vậy thôi


Ta sẽ xem đối tượng a_game làm gì.

Phương thức play của đối tượng a_game

Hãy xem coi cái phương thức này có cái gì. Xem dòng đầu tiên

current_scene = self.scene_map.opening_scene()

self là gì phải nắm rõ nhé, không thì đừng đọc tiếp mà học lại OOP. Ở đây, phương thức này tạo ra một biến là current_scene. Hãy xem tiếp vế bên kia! Nhớ thuộc tính scene_map chứ? Đúng rồi đấy, nó là một đối tượng thuộc lớp Map. Mà đối tượng lớp Map thì có một phương thức là opening_scene. Thế nên, ta phải coi, phương thức này làm gì.


Phương thức opening_scene của lớp Map

phương thức này đúng một dòng

return self.next_scene(self.start_scene)

start_scene là gì? Là một thuộc tính của lớp Map. Vậy giá trị nó là gì? Hãy nhớ lại xem ai gọi phương thức này? Có phải là một thuộc tính của lớp Engine không? Thuộc tính đó là scene_map và giá trị nó là đối tượng a_map mà lúc đầu ta khởi tạo. Vậy suy ra start_scene là một thuộc tính của đối tượng a_map. Kiểm tra lại giá trị thuộc tính start_scene của đối tượng a_map xem! Chính là chuỗi "central_corridor". Vậy là ta có thể viết ảo hàm opening_scene của đối tượng a_map (chính là giá trị của thuộc tính scene_map của đối tượng a_game thuộc lớp Engine).

return self.next_scene("central_corridor")

Xem xét tiếp phương thức next_scene

Phương thức next_scene

Cũng một dòng đó là

return Map.scenes.get(scene_name)

Nếu bạn hiểu phần OOP này, bạn có thể thay thế thành

return self.scenes.get(scene_name)

Nhưng làm như vậy là không hay cho lắm nếu bạn hiểu mà còn kĩ. Nhưng mà thôi, cứ theo tác giả đi. Map.scenes là gì? Là một dict đúng không? Check lại code xem. Ok, vậy là được rồi, muốn hiểu cái get là gì thì search method get of dictionary in Python là hiểu ra thôi. Ở đây giá trị mà nó return về là CentralCorridor(). Nếu bạn hiểu OOP, bạn sẽ biết đây là một đối tượng thuộc lớp CentralConrridor
Lưu ý: Phải biết sự khác nhau giữa some_class() với lại some_class. Ở đây là CentralCorridor()CentralCorridor. Với CentralCorridor() ở đây là một đối tượng. Vậy là nó return một đối tượng thuộc lớp CentralCorridor thế thôi. Giá trị này sẽ được trả về phương thức openning_scene và rồi phương thức opening_scene sẽ trả về lại cho biến current_scene ở phương thức play như lúc đầu chúng ta nói. Ở đây hiểu tí đệ quy là thấy dễ ợt. Còn mình sẽ nói đơn giản luôn đó chính là biến current_scene ở phương thức play sẽ nhận được giá trị là một đối tượng thuộc lớp CentralCorridor. Vậy thôi là xong rồi, đoạn cuối nó cũng đơn giản thôi, cách hoạt động cũng như bình thường.

Vài lời của người reply

Thật ra, xưa bài này mình bỏ. Tại nó khó quá. Một phần là chưa hiểu rõ OOP. Nói chung là bạn cưỡi ngựa xem hoa bài này thôi, hiểu được thì càn tốt.
Bạn phải hiểu rõ cái OOP này. Xưa mình học của anh này, nói chung là đi đúng hướng và giải thích tại sao phải thế này, tại sao phải thế kia.

Chứ mình thấy Cuốn LearnPythonTheHardWay thì bạn khó hiểu OOP lắm.

Lê Thành Công viết 13:25 ngày 01/10/2018

Bạn có thể giải thích luôn giùm mình chỗ vòng lặp while được không? Dòng đầu tiên thì mình hiểu là sẽ gọi hàm enter() trong class CentralCorridor() nhưng dòng thứ 2 không hiểu nó làm gì. Bạn giải thích giùm mình với.

Henry viết 13:25 ngày 01/10/2018

Như mình đã nói, scene_map là một đối tượng thuộc lớp Map. Vậy bạn xem phương thức next_scene trong lớp Map đi . Cách hoạt động y chang, mình đã đề cập

Lê Thành Công viết 13:29 ngày 01/10/2018

Cảm ơn nhé! Mình hiểu rồi. Phải có dòng thứ hai thì hàm return trong các class thì nó mới hoạt động được. Hhihi. Mà bạn có nick fb không cho mình làm quen với?

Henry viết 13:29 ngày 01/10/2018

https://www.facebook.com/thanhtrung2314

Bài liên quan
0