Python là một ngôn ngữ lập trình hướng đối tượng. Không giống như lập trình hướng thủ tục nhấn mạnh vào các hàm, lập trình hướng đối tượng tập trung làm việc trên các đối tượng.

Đối tượng (Object) chỉ đơn giản là một tập hợp các dữ liệu (các biến) và các phương thức (các hàm) hoạt động trên các dữ liệu đó. Và, lớp (class) là một kế hoạch chi tiết cho đối tượng.

Chúng ta có thể nghĩ về class như một bản phác thảo (nguyên mẫu) của một ngôi nhà. Nó chứa tất cả các chi tiết về sàn nhà, cửa ra vào, cửa sổ,… Dựa trên những mô tả này, chúng ta sẽ xây dựng những ngôi nhà. Vậy nhà ở đây chính là đối tượng.

Vì nhiều ngôi nhà có thể được làm từ một mô tả nên chúng ta có thể tạo ra nhiều vật thể từ một lớp. Một đối tượng cũng được gọi là một thể hiện (instance) của một lớp và quá trình tạo đối tượng này được gọi là instantiation.

Khai báo Class

Giống như khai báo các hàm bắt đầu bằng một từ khóa là def thì khai báo lớp trong Python sử dụng từ khóa class.

Dòng kí tự đầu tiên được gọi là docstring – một mô tả ngắn gọn về lớp. Docstring này không bắt buộc nhưng khuyến khích sử dụng.

class MyNewClass:
     '''Đây là docstring. Một lớp mới vừa được khai báo.'''
     pass

Đây là cách khai báo class đơn giản.

Class tạo ra một local namespace mới trở thành nơi để các thuộc tính của nó được khai báo. Thuộc tính có thể là hàm hoặc dữ liệu.

Ngoài ra còn có các thuộc tính đặc biệt bắt đầu với dấu gạch dưới kép (__). Ví dụ: __doc__ sẽ trả về chuỗi docstring mô tả của lớp đó.

Ngay khi khai báo một lớp, môt đối tượng trong lớp mới sẽ được tạo ra với cùng một tên. Đối tượng lớp này cho phép chúng ta truy cập các thuộc tính khác nhau cũng như để khởi tạo các đối tượng mới của lớp đó.

class MyClass:
     "Đây là class thứ 2 được khởi tạo"
     a = 10
     def func(self):
        print('Xin chào')

# Output: 10
print(MyClass.a)

# Output: <function MyClass.func at 0x0000000003079BF8>
print(MyClass.func)

# Output: 'Đây là class thứ 2 được khởi tạo'
print(MyClass.__doc__)

Sau khi chạy chương trình, kết quả được trả về là:

10
<function MyClass.func at 0x7fe90f834400>
Đây là class th 2 được khi to

Tạo đối tượng trong Python

Như đã nói ở các bài học trước, đối tượng trong class có thể được sử dụng để truy cập các thuộc tính khác nhau và tạo các instance mới của lớp đó. Thủ tục để tạo một đối tượng tương tự như cách chúng ta gọi hàm.

ob = MyClass()

Lệnh này đã tạo ra một đối tượng mới có tên là ob.

Một ví dụ kĩ hơn về tạo đối tượng bao gồm cả các thuộc tính, phương thức:

class MyClass: 
     "Đây là class thứ 3 được khởi tạo" 
     a = 10 
     def func(self): 
        print('Xin chào')

ob = MyClass()

# Output: <function MyClass.func at 0x000000000335B0D0>
print(MyClass.func)

# Output: <bound method MyClass.func of <__main__.MyClass object at 0x000000000332DEF0>>
print(ob.func)

# Gọi hàm func()
# Output: Xin chào
ob.func()

Bạn có thể thấy rằng khi định nghĩa hàm trong class, ta có parameter là self, nhưng khi gọi hàm obj.func() không cần parameter, vẫn không gặp lỗi. Bởi vì, bất cứ khi nào, object gọi các phương thức, object sẽ tự pass qua parameter đầu tiên. Nghĩa là obj.func() tương đương với MyClass.func(obj)

Constructor trong Python

Hàm trong Class được bắt đầu với dấu gạch dưới kép (__) là các hàm đặc biệt, mang các ý nghĩa đặc biệt.

Một trong đó là hàm __init__(). Hàm này được gọi bất cứ khi nào khởi tạo một đối tượng, một biến mới trong class và được gọi là constructor trong lập trình hướng đối tượng.

class SoPhuc:

     def __init__(self,r = 0,i = 0):
        self.phanthuc = r
        self.phanao = i

     def getData(self):
        print("{}+{}j".format(self.phanthuc,self.phanao))

# Tạo đối tượng số phức mới
c1 = SoPhuc(2,3)

# Gọi hàm getData()
# Output: 2+3j
c1.getData()

# Tạo đối tượng số phức mới
# tạo thêm một thuộc tính mới (new)
c2 = SoPhuc(5)
c2.new = 10

# Output: (5, 0, 10)
print((c2.phanthuc, c2.phanao, c2.new))
 
# Đối tượng c1 không có thuộc tính 'new'
# AttributeError: 'SoPhuc' object has no attribute 'new'
c1.new

Trong ví dụ trên, chúng ta khai báo một lớp mới để biểu diễn các số phức. Nó có hai hàm, __init __() để khởi tạo các biến (mặc định là 0) và getData() để hiển thị đúng số.

Lưu ý rằng các thuộc tính thêm vào của đối tượng có thể được tạo ra một cách nhanh chóng, như ở ví dụ trên là ta đã tạo một thuộc tính mới ‘new’ cho đối tượng c2 và có thể gọi ra ngay lập tức. Tuy nhiên thuộc tính mới này sẽ không áp dụng với các đối tượng đã khai báo trước như c1.

Xóa bỏ thuộc tính và đối tượng

Thuộc tính của đối tượng có thể bị xóa bằng lệnh del.

>>> c1 = SoPhuc(2,3)
>>> del c1.phanao
>>> c1.getData()
Traceback (most recent call last):
...
AttributeError: 'SoPhuc' object has no attribute 'phanao'

>>> del SoPhuc.getData
>>> c1.getData()
Traceback (most recent call last):
...
AttributeError: 'SoPhuc' object has no attribute 'getData'

Thậm chí bạn có thể xóa chính đối tượng đó bằng cách sử dụng câu lệnh del.

>>> c1 = SoPhuc(1,3)
>>> del c1
>>> c1
Traceback (most recent call last):
...
NameError: name 'c1' is not defined

Sau khi bị xóa, object vẫn tồn tại trên bộ nhớ, nhưng sau đó phương thức destruction của Python (hay còn gọi là garbage collection) sẽ loại bỏ hoàn toàn các dữ liệu này trên bộ nhớ.

Bài viết hôm nay Tin học của em đã cung cấp cho bạn các kiến thức cơ bản về Class và Object rồi đấy. Để tiếp tục chủ đề về Lập trình hướng đối tượng trong Python, bài sau Tin học của em sẽ cùng bạn tìm hiểu về Kế thừa và Đa kế thừa. Mời bạn đọc theo dõi.

370 BÌNH LUẬN

  1. Heya! I just wanted to ask if you ever have any issues with hackers?
    My last blog (wordpress) was hacked and I ended up losing months of hard work due to no data backup.
    Do you have any methods to prevent hackers?

  2. This is really interesting, You are a very skilled blogger.
    I have joined your feed and look forward to seeking more of
    your excellent post. Also, I’ve shared your site in my
    social networks!

  3. I have really noticed that credit score improvement activity has to be conducted wih tactics.
    If not, you are going to find yourself destroying your rating.
    In ordwr too grow into success fixing your credit history you have to take care
    that from this instant you pay your entire monthly dues promptly in advwnce of
    their booked date. It is significant because
    by certainly not accomplishing that area, all other steps that you ill choose to use to improve
    yor credit position will not be useful. Thanks for discussing your strategies.

  4. Hmm it looks like your website ate my first comment (it was super long)
    so I guess I’ll just sum it up what I submitted and say, I’m
    thoroughly enjoying your blog. I too am an aspiring blog writer but I’m still new to everything.

    Do you have any tips and hints for beginner blog writers?
    I’d certainly appreciate it.

  5. When someone writes an article he/she maintains the thought of a user in his/her brain that how a user can be aware of it.
    Therefore that’s why this article is amazing.
    Thanks!

  6. LK7KPZ Normally I do not learn article on blogs, but I would like to say that this write-up very compelled me to try and do so! Your writing style has been surprised me. Thanks, quite nice article.

  7. Very nice post. I just stumbled upon your blog and wished to say that I have truly enjoyed browsing your blog posts. In any case I will be subscribing to your rss feed and I hope you write again soon!

  8. I think other website proprietors should take this website as an model, very clean and magnificent user genial style and design, let alone the content. You are an expert in this topic!

  9. Wow! This can be one particular of the most useful blogs We have ever arrive across on this subject. Actually Great. I am also a specialist in this topic therefore I can understand your hard work.

  10. Your style is very unique in comparison to other people I have read stuff from. I appreciate you for posting when you ave got the opportunity, Guess I all just bookmark this page.

  11. It as not that I want to copy your website, excluding I especially like the layout. Possibly will you discern me which propose are you using? Or was it custom made?

  12. This is really interesting, You are a very skilled blogger. I have joined your rss feed and look forward to seeking more of your magnificent post. Also, I have shared your site in my social networks!

  13. This is a good tip particularly to those new to the blogosphere. Simple but very accurate information Appreciate your sharing this one. A must read article!

  14. I will immediately seize your rss feed as I can not in finding your email subscription link or newsletter service. Do you ave any? Kindly permit me know so that I may subscribe. Thanks.

  15. I just could not go away your site before suggesting that I actually enjoyed the standard information an individual supply in your visitors?
    Is going to be back often in order to investigate cross-check new posts

  16. Estudios posteriores en varones sugieren que este efecto es improbable en humanos, aunque en algunos hombres se ha observado una disminución de la concentración de esperma. Entre las pruebas más usuales se encuentran los análisis de sangre para comprobar el nivel de hormonas masculinas, la posible presencia de azúcar alto en la sangre, niveles de homocisteína y exploraciones físicas para detectar cualquier posible tumor o anomalía genital.

  17. Hi! Do you know if they make any plugins to assist with Search Engine Optimization? I’m trying to get my
    blog to rank for some targeted keywords but I’m not seeing very good success.

    If you know of any please share. Thanks!

  18. My spouse and I absolutely love your blog and find a lot of
    your post’s to be just what I’m looking for. Would you offer guest writers to
    write content for you personally? I wouldn’t mind producing
    a post or elaborating on most of the subjects you write with regards to here.

    Again, awesome website!

  19. I want to to thank you for this wonderful read!! I certainly loved every little bit of it.

    I have got you book marked to look at new stuff you post…

  20. This is really interesting, You are a very skilled blogger. I ave joined your rss feed and look forward to seeking more of your wonderful post. Also, I ave shared your website in my social networks!

  21. Wonderful blog! I found it while surfing around on Yahoo News. Do you have any suggestions on how to get listed in Yahoo News? I ave been trying for a while but I never seem to get there! Thank you

  22. I will right away clutch your rss feed as I can not find your email subscription hyperlink or e-newsletter service. Do you ave any? Kindly permit me recognize in order that I may subscribe. Thanks.

  23. Is not it superb any time you get a fantastic submit? Value the admission you given.. Fantastic opinions you might have here.. Truly appreciate the blog you provided..

  24. Wow! This could be one particular of the most helpful blogs We have ever arrive across on this subject. Basically Magnificent. I am also a specialist in this topic so I can understand your hard work.

  25. Nice post. I learn something new and challenging on websites I stumbleupon everyday. It will always be useful to read content from other authors and practice something from their websites.

  26. Thanks for another great article. Where else could anybody get that kind of info in such an ideal method of writing? I have a presentation subsequent week, and I am at the search for such info.

  27. Usually I don at learn post on blogs, but I wish to say that this write-up very forced me to take a look at and do it! Your writing taste has been surprised me. Thank you, very great post.

  28. It as not that I want to duplicate your web page, but I really like the design and style. Could you let me know which theme are you using? Or was it custom made?

  29. I think other web-site proprietors should take this web site as an model, very clean and excellent user friendly style and design, let alone the content. You are an expert in this topic!

  30. This very blog is no doubt cool and diverting. I have picked a bunch of handy tips out of this blog. I ad love to go back over and over again. Cheers!

  31. Well done for posting on this subject. There is not enough content posted about it (not particularly good anyway). It is pleasing to see it receiving a little bit more coverage. Cheers!

  32. Very interesting information!Perfect just what I was searching for! Charity is injurious unless it helps the recipient to become independent of it. by John Davidson Rockefeller, Sr..

  33. You made some good points there. I checked on the net for more information about the issue and found most individuals will go along with your views on this site.

  34. I will right away grab your rss feed as I can at to find your email subscription hyperlink or e-newsletter service. Do you have any? Kindly let me know so that I may subscribe. Thanks.

  35. This is really fascinating, You are a very professional blogger. I ave joined your rss feed and sit up for searching for more of your great post. Also, I have shared your site in my social networks!

  36. I was suggested this web site by my cousin. I am not sure whether this post is written by him as no one else know such detailed about my trouble. You are amazing! Thanks!

THOÁT KHỎI BÌNH LUẬN

Please enter your comment!
Please enter your name here