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_mapKhi vào hàm
__init__nó được đặt một cái thuộc tính làstart_scenevớ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_mapcủa lớpMapchỉ có thế.Tiếp theo là đối tượng
a_gamecủa lớpEngineXét đối tượng
a_gamekhởi tạo đối tượng này với một thuộc tính đó là
scene_mapvà giá trị của nó là? Là một đối tượng của lớpMapcụ thể đó chính là đối tượnga_map. Rồi chỉ vậy thôiTa sẽ xem đối tượng
a_gamelàm gì.Phương thức
playcủa đối tượnga_gameHãy xem coi cái phương thức này có cái gì. Xem dòng đầu tiên
selflà 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_mapchứ? Đúng rồi đấy, nó là một đối tượng thuộc lớpMap. Mà đối tượng lớpMapthì 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_scenecủa lớpMapphương thức này đúng một dòng
start_scenelà 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ớpEnginekhông? Thuộc tính đó làscene_mapvà giá trị nó là đối tượnga_mapmà lúc đầu ta khởi tạo. Vậy suy rastart_scenelà một thuộc tính của đối tượnga_map. Kiểm tra lại giá trị thuộc tínhstart_scenecủa đối tượnga_mapxem! Chính là chuỗi"central_corridor". Vậy là ta có thể viết ảo hàmopening_scenecủa đối tượnga_map(chính là giá trị của thuộc tínhscene_mapcủa đối tượnga_gamethuộc lớpEngine).Xem xét tiếp phương thức
next_scenePhương thức
next_sceneCũ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.sceneslà 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 Pythonlà 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ớpCentralConrridorLư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ớpCentralCorridorthế thôi. Giá trị này sẽ được trả về phương thứcopenning_scenevà rồi phương thứcopening_scenesẽ trả về lại cho biếncurrent_sceneở phương thứcplaynhư 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ứcplaysẽ 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_maplà một đối tượng thuộc lớpMap. Vậy bạn xem phương thứcnext_scenetrong 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