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!

Bài liên quan
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íchBạ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ớpMap
đó 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ượnga_map
của lớpMap
chỉ có thế.Tiếp theo là đối tượng
a_game
của lớpEngine
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ớpMap
cụ thể đó chính là đối tượnga_map
. Rồi chỉ vậy thôiTa sẽ xem đối tượng
a_game
làm gì.Phương thức
play
của đối tượnga_game
Hãy xem coi cái phương thức này có cái gì. Xem dòng đầu tiên
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ínhscene_map
chứ? Đúng rồi đấy, nó là một đối tượng thuộc lớpMap
. Mà đối tượng lớpMap
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ớpMap
phương thức này đúng một dòng
start_scene
là gì? Là một thuộc tính của lớpMap
. 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ớpEngine
không? Thuộc tính đó làscene_map
và giá trị nó là đối tượnga_map
mà lúc đầu ta khởi tạo. Vậy suy rastart_scene
là một thuộc tính của đối tượnga_map
. Kiểm tra lại giá trị thuộc tínhstart_scene
của đối tượnga_map
xem! Chính là chuỗi"central_corridor"
. Vậy là ta có thể viết ảo hàmopening_scene
của đối tượnga_map
(chính là giá trị của thuộc tínhscene_map
của đối tượnga_game
thuộc lớpEngine
).Xem xét tiếp phương thức
next_scene
Phương thức
next_scene
Cũng một dòng đó là
Nếu bạn hiểu phần OOP này, bạn có thể thay thế thành
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ì searchmethod 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ớpCentralConrridor
Lưu ý: Phải biết sự khác nhau giữa
some_class()
với lạisome_class
. Ở đây làCentralCorridor()
vàCentralCorridor
. VớiCentralCorridor()
ở đây là một đối tượng. Vậy là nó return một đối tượng thuộc lớpCentralCorridor
thế thôi. Giá trị này sẽ được trả về phương thứcopenning_scene
và rồi phương thứcopening_scene
sẽ trả về lại cho biếncurrent_scene
ở phương thứcplay
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ếncurrent_scene
ở phương thứcplay
sẽ nhận được giá trị là một đối tượng thuộc lớpCentralCorridor
. 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ớpMap
. Vậy bạn xem phương thứcnext_scene
trong lớpMap
đi . Cách hoạt động y chang, mình đã đề cậpCả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?
https://www.facebook.com/thanhtrung2314