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!
Lập trình hướng đối tượng trong python
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
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.
Đầ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()
và 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.
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.
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
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?