Python là một ngôn ngữ lập trình hướng đối tượng mạnh. Vì vậy, việc tạo ra và sử dụng các đối tượng là hết sức dễ dàng. Bài viết sẽ giới thiệu qua một số khái niệm cơ bản trong lập trình hướng đối tượng, cũng như cách khởi tạo và sử dụng chúng. Mời bạn đọc theo dõi.

Giới thiệu về OOP trong Python

Lập trình hướng đối tượng (tiếng Anh: Object-oriented programming, viết tắt: OOP) là một kỹ thuật hỗ trợ, cho phép lập trình viên trực tiếp làm việc với các đối tượng mà họ định nghĩa lên. Hiệu quả của kĩ thuật này giúp tăng năng suất, đơn giản hoá độ phức tạp khi bảo trì cũng như mở rộng phần mềm. Hiện nay có khá nhiều ngôn ngữ lập trình theo hướng đối tượng như C++, Java, PHP,… và còn cả Python.

Khái niệm về OOP trong Python tập trung vào việc tạo code sử dụng lại. Khái niệm này còn được gọi là DRY (Don’t Repeat Yourself).

Các nguyên lý

Trong Python, khái niệm về OOP tuân theo một số nguyên lý cơ bản là tính đóng gói, tính kế thừa và tính đa hình.

Tính kế thừa (Inheritance): cho phép một lớp (class) có thể kế thừa các thuộc tính và phương thức từ các lớp khác đã được định nghĩa.

Tính đóng gói (Encapsulation): là quy tắc yêu cầu trạng thái bên trong của một đối tượng được bảo vệ và tránh truy cập được từ code bên ngoài (tức là code bên ngoài không thể trực tiếp nhìn thấy và thay đổi trạng thái của đối tượng đó).

Tính đa hình (Polymorphism): là khái niệm mà hai hoặc nhiều lớp có những phương thức giống nhau nhưng có thể thực thi theo những cách thức khác nhau.

Lớp (Class) và Đối tượng (Object)

Class và Object là hai khái niệm cơ bản trong lập trình hướng đối tượng.

Đối tượng (Object) là những thực thể tồn tại có hành vi.

Ví dụ đối tượng là một xe ô tô có tên hãng, màu sắc, loại nguyên liệu, hành vi đi, dừng, đỗ, nổ máy…

Lớp (Class) là một kiểu dữ liệu đặc biệt do người dùng định nghĩa, tập hợp nhiều thuộc tính đặc trưng cho mọi đối tượng được tạo ra từ lớp đó.

Thuộc tính là các giá trị của lớp. Sau này khi các đối tượng được tạo ra từ lớp, thì thuộc tính của lớp lúc này sẽ trở thành các đặc điểm của đối tượng đó.

Phân biệt giữa Đối tượng (Object) và Lớp (Class):

Đối tượng (Object): có trạng thái và hành vi.

Lớp (Class): có thể được định nghĩa như là một template mô tả trạng thái và hành vi mà loại đối tượng của lớp hỗ trợ. Một đối tượng là một thực thể (instance) của một lớp

Ví dụ về Class và Object:

class Car:

     # thuộc tính lớp
     loaixe = "Ô tô"

     # thuộc tính đối tượng
     def __init__(self, tenxe, mausac, nguyenlieu):
        self.tenxe = tenxe
        self.mausac = mausac
        self.nguyenlieu = nguyenlieu

# instantiate the Car class
toyota = Car("Toyota", "Đỏ", "Điện")
lamborghini = Car("Lamborghini", "Vàng", "Deisel")
porsche = Car("Porsche", "Xanh", "Gas")

# access the class attributes
print("Porsche là {}.".format(porsche.__class__.loaixe))
print("Toyota là {}.".format(toyota.__class__.loaixe))
print("Lamborghini cũng là {}.".format(lamborghini.__class__.loaixe))

# access the instance attributes
print("Xe {} có màu {}. {} là nguyên liệu vận hành.".format( toyota.tenxe, toyota.mausac, toyota.nguyenlieu))
print("Xe {} có màu {}. {} là nguyên liệu vận hành.".format( lamborghini.tenxe, lamborghini.mausac,lamborghini.nguyenlieu))
print("Xe {} có màu {}. {} là nguyên liệu vận hành.".format( porsche.tenxe, porsche.mausac, porsche.nguyenlieu))

Kết quả trả về sẽ là:

Porsche là Ô tô.
Toyota là Ô tô.
Lamborghini cũng là Ô tô.
Xe Toyota có màu Đỏ. Đin là nguyên liu vn hành.
Xe Lamborghini có màu Vàng. Deisel là nguyên liu vn hành.
Xe Porsche có màu Xanh. Gas là nguyên liu vn hành.

Chương trình trên tạo một lớp Car, sau đó xác định các thuộc tính, đặc điểm của đối tượng

Chúng ta truy cập thuộc tính class bằng cách sử dụng __class __.loaixe. Các thuộc tính lớp được chia sẻ cho tất cả các cá thể của lớp.

Tương tự, chúng ta truy cập các thuộc tính instance bằng cách sử dụng toyota.tenxe, toyota.mausac và toyota.nguyenlieu.

Tuy nhiên, các thuộc tính instance là khác nhau cho mỗi cá thể của một lớp.

Phương thức

Phương thức (Method) là các hàm được định nghĩa bên trong phần thân của một lớp. Chúng được sử dụng để xác định các hành vi của một đối tượng.

Ví dụ về Class và Method

class Car:

     # thuộc tính đối tượng
     def __init__(self, tenxe, mausac, nguyenlieu):
        self.tenxe = tenxe
        self.mausac = mausac
 self.nguyenlieu = nguyenlieu

     # phương thức
     def dungxe(self, mucdich):
        return "{} đang dừng xe để {}".format(self.tenxe,mucdich)

     def chayxe(self):
        return "{} đang chạy trên đường".format(self.tenxe)

 def nomay(self): 
        return "{} đang nổ máy".format(self.tenxe)

# instantiate the Car class
toyota = Car("Toyota", "Đỏ", "Điện")
lamborghini = Car("Lamborghini", "Vàng", "Deisel")
porsche = Car("Porsche", "Xanh", "Gas")

# call our instance methods
print(toyota.dungxe("nạp điện"))
print(lamborghini.chayxe())
print(porsche.nomay())

Chạy chương trình, màn hình sẽ trả về kết quả:

Toyota đang dng xe để np đin
Lamborghini đang chy trên đường
Porsche đang n máy

Ở ví dụ này, có ba phương thức là dungxe(), chayxe() và nomay(). Chúng được gọi là phương thức instance bởi vì chúng được gọi trên một đối tượng instance (toyota, lamborghini, porsche).

Kế thừa (Inheritance)

Tính kế thừa cho phép một lớp (class) có thể kế thừa các thuộc tính và phương thức từ các lớp khác đã được định nghĩa. Lớp đã có gọi là lớp cha, lớp mới phát sinh gọi là lớp con. Lớp con kế thừa tất cả thành phần của lớp cha, có thể mở rộng các thành phần kế thừa và bổ sung thêm các thành phần mới.

# Lớp cha
class Car:

     # Constructor
     def __init__(self, hangxe, tenxe, mausac):
        # Lớp Car có 3 thuộc tính: tenxe, mausac, hang xe
        self.hangxe = hangxe
        self.tenxe = tenxe
        self.mausac = mausac

     # phương thức
     def chayxe(self):
        print ("{} đang chạy trên đường".format(self.tenxe))

     def dungxe(self, mucdich):
        print ("{} đang dừng xe để {}".format(self.tenxe, mucdich))

# Lớp Toyota mở rộng từ lớp Car.
class Toyota(Car):

     def __init__(self, hangxe, tenxe, mausac, nguyenlieu):
 # Gọi tới constructor của lớp cha (Car) 
        # để gán giá trị vào thuộc tính của lớp cha.
 super().__init__(hangxe, tenxe, mausac)

        self.nguyenlieu = nguyenlieu

     # Kế thừa phương thức cũ
     def chayxe(self):
        print ("{} đang chạy trên đường".format(self.tenxe))

     # Ghi đè (override) phương thức cùng tên của lớp cha.
     def dungxe(self, mucdich):
        print ("{} đang dừng xe để {}".format(self.tenxe, mucdich))
        print ("{} chạy bằng {}".format(self.tenxe, self.nguyenlieu))

 # Bổ sung thêm thành phần mới 
     def nomay(self):
        print ("{} đang nổ máy".format(self.tenxe))

toyota1 = Toyota("Toyota", "Toyota Hilux", "Đỏ", "Điện")
toyota2 = Toyota("Toyota", "Toyota Yaris", "Vàng", "Deisel")
toyota3 = Toyota("Toyota", "Toyota Vios", "Xanh", "Gas")

toyota1.dungxe("nạp điện")
toyota2.chayxe()
toyota3.nomay()

Kết quả trả về:

Toyota Hilux đang dng xe để np đin
Toyota Hilux chy bng Đin
Toyota Yaris đang chy trên đường
Toyota Vios đang n máy

Chương trình này tạo hai lớp kế thừa: lớp cha Car và lớp con Toyota.

Khai báo constructor mới để gán giá trị vào thuộc tính của lớp cha. Hàm super() đứng trước phương thức __init __ để gọi tới nội dung __init __ của Car.

Class Toyota kế thừa hàm chayxe() và dungxe() của class Car đồng thời sửa đổi một hành vi thể hiện ở phương thức dungxe(). Sau đó lớp con bổ sung thêm thành phần mới là nomay() để mở rộng kế thừa.

Đóng gói (Encapsulation)

Sử dụng OOP trong Python, chúng ta có thể hạn chế quyền truy cập vào trạng thái bên trong của đối tượng. Điều này ngăn chặn dữ liệu bị sửa đổi trực tiếp, được gọi là đóng gói. Trong Python, chúng ta biểu thị thuộc tính private này bằng cách sử dụng dấu gạch dưới làm tiền tố: “_” hoặc “__“.

class Computer:

     def __init__(self):
        # Thuộc tính private ngăn chặn sửa đổi trực tiếp
        self.__maxprice = 900

 def sell(self): 
        print("Giá bán sản phẩm: {}".format(self.__maxprice))

     def setMaxPrice(self, price):
        self.__maxprice = price

c = Computer()c.sell()

# thay đổi giá.
c.__maxprice = 1000
c.sell()

# sử dụng hàm setter để thay đổi giá.
c.setMaxPrice(1000)
c.sell()

Màn hình hiển thị kết quả:

Selling Price: 900
Selling Price: 900
Selling Price: 1000

Ở ví dụ này, bạn khởi tạo class Computer, sử dụng __init __() để lưu trữ giá bán tối đa của máy tính. Nhưng sau khi sử dụng, bạn có nhu cầu sửa đổi giá, tuy nhiên không thể thay đổi theo cách bình thường vì Python đã coi __maxprice là thuộc tính private. Vậy nên để thay đổi giá trị, ta sử dụng hàm setter setMaxPrice().

Đa hình (Polymorphism)

Tính đa hình là khái niệm mà hai hoặc nhiều lớp có những phương thức giống nhau nhưng có thể thực thi theo những cách thức khác nhau.

Giả sử, chúng ta cần tô màu một hình khối, có rất nhiều lựa chọn cho hình của bạn như hình chữ nhật, hình vuông, hình tròn. Tuy nhiên, bạn có thể sử dụng cùng một phương pháp để tô màu bất kỳ hình dạng nào.

class Toyota:

     def dungxe(self):
        print("Toyota dừng xe để nạp điện")

     def nomay(self):
        print("Toyota nổ máy bằng hộp số tự động")

class Porsche:

     def dungxe(self):
        print("Porsche dừng xe để bơm xăng")

     def nomay(self):
        print("Porsche nổ máy bằng hộp số cơ")

# common interface
def kiemtra_dungxe(car): car.dungxe()

# instantiate objects
toyota = Toyota()
porsche = Porsche()

# passing the object
kiemtra_dungxe(toyota)
kiemtra_dungxe(porsche)

Ở ví dụ này, bạn vừa tạo hai lớp Toyota và Porsche, cả hai lớp đều có phương thức dungxe(). Truy nhiên hàm của chúng khác nhau. Ta sử dụng tính đa hình để tạo hàm chung cho hai lớp, đó là kiemtra_dungxe(). Tiếp theo, bạn truyền đối tượng toyota và porsche vào hàm vừa tạo, và ta lấy được kết quả như này:

Toyota dng xe để np đin
Porsche dng xe để bơm xăng

Vậy là Tin học của em vừa giới thiệu cho bạn những điểm nổi bật của OOP rồi. Qua bài viết, có thể rút ra một số nhận xét như này:

  • Lập trình trở nên dễ dàng và hiệu quả hơn.
  • Class có thể chia sẻ được nên code dễ dàng được sử dụng lại.
  • Năng suất của chương trình tăng lên
  • Dữ liệu an toàn và bảo mật với trừu tượng hóa dữ liệu.

309 BÌNH LUẬN

  1. It as not that I want to duplicate your web page, but I really like the style. Could you tell me which style are you using? Or was it especially designed?

  2. Wow! This could be one particular of the most helpful blogs We have ever arrive across on this subject. Actually Wonderful. I am also an expert in this topic therefore I can understand your hard work.

  3. If you are going away to watch funny videos on the web then I suggest you to visit this web site, it contains really therefore comical not only movies but also extra information.

  4. I will immediately seize your rss feed as I can at find your email subscription hyperlink or newsletter service. Do you have any? Please let me know so that I may just subscribe. Thanks.

  5. My family always say that I am wasting my time here at net, however I know I am getting knowledge all the time by reading thes fastidious articles or reviews.

  6. This awesome blog is obviously educating as well as amusing. I have picked many handy advices out of this source. I ad love to return again and again. Thanks a bunch!

  7. Sweet 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! Thanks

  8. Awesome blog! Do you have any recommendations for aspiring writers?
    I’m planning to start my own site soon but I’m a little lost on everything.
    Would you propose starting with a free platform like WordPress or go for a paid option? There are so many options out there that I’m totally confused ..
    Any ideas? Thank you!

  9. Whats up. Very nice site!! Man.. Beautiful.. Wonderful.. I all bookmark your blog and take the feeds alsoI am satisfied to locate numerous useful info here within the post. Thank you for sharing

  10. Wow! This can be one particular of the most helpful blogs We ave ever arrive across on this subject. Basically Wonderful. I am also an expert in this topic therefore I can understand your effort.

  11. I wanted to thank you for this fantastic write-up, I certainly loved every little bit of it. I have bookmarked your internet site to look at the latest stuff you post.

  12. This unique blog is definitely educating as well as diverting. I have chosen many interesting stuff out of this blog. I ad love to visit it every once in a while. Cheers!

  13. Great post. I was checking constantly this blog and I’m
    inspired! Extremely helpful info specially the final section 🙂 I deal with such
    information much. I was looking for this particular
    info for a long time. Thanks and best of luck.

  14. Particularly helpful point of view, thank you for blogging.. I enjoy you telling your perspective.. So content to have found this publish.. So content to get discovered this submit..

  15. Spot up with Spot up with this write-up, I honestly feel this website needs additional consideration. I all apt to be again to learn to read considerably more, many thanks for that information.

  16. Wow, fantastic blog format! How long have you ever been blogging for? you made running a blog look easy. The entire glance of your website is magnificent, let alone the content material!

  17. Wow! This could be one particular of the most useful blogs We ave ever arrive across on this subject. Basically Great. I am also a specialist in this topic therefore I can understand your effort.

  18. Usually I do not read post on blogs, however I wish to say that this write-up very compelled me to take a look at and do it! Your writing style has been surprised me. Thank you, very great post.

  19. Thanks a whole lot for sharing this with all of us you really know what you are speaking about! Bookmarked. Kindly also check out my web-site =). We could possess a link exchange contract amongst us!

  20. Whats up! I simply want to give an enormous thumbs up for the good information you have got right here on this post. I shall be coming again to your weblog for extra soon.

  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! Thanks

  22. Thanks on your marvelous posting! I seriously enjoyed reading it, you can be a
    great author.I will be sure to bookmark your blog and will eventually come
    back from now on. I want to encourage continue your great writing, have a nice morning!

  23. Hi! I just wanted to ask if you ever have any problems with hackers?
    My last blog (wordpress) was hacked and I ended up losing several
    weeks of hard work due to no data backup. Do you have any solutions to stop hackers?

  24. I’а†ve learn some just right stuff here. Definitely price bookmarking for revisiting. I wonder how much effort you set to make the sort of great informative website.

  25. Your style is very unique in comparison to other people I have read stuff from. Many thanks for posting when you have the opportunity, Guess I will just bookmark this site.

  26. Particularly helpful point of view, thank you for blogging.. I enjoy you telling your perspective.. So content to have found this publish.. So content to get discovered this submit..

  27. Hello there, I discovered your website by way of Google while searching for a related matter, your site got here up, it looks
    good. I have bookmarked it in my google bookmarks.
    Hello there, just changed into aware of your blog via Google, and located that it’s truly informative.
    I’m gonna watch out for brussels. I will appreciate for those who continue this in future.
    Numerous other folks will be benefited out of your
    writing. Cheers!

  28. I truly appreciate this post. I have been looking everywhere for this! Thank goodness I found it on Bing. You have made my day! Thx again..

  29. This site can be a stroll-by means of for all the information you needed about this and didn?t know who to ask. Glimpse right here, and also you?ll undoubtedly uncover it.

  30. I’а†ve learn several excellent stuff here. Certainly price bookmarking for revisiting. I surprise how so much effort you set to create this kind of wonderful informative web site.

  31. I will immediately snatch your rss as I can not in finding your e-mail subscription link or e-newsletter service. Do you ave any? Please allow me realize so that I could subscribe. Thanks.

  32. I will right away grab your rss as I can not find your e-mail subscription link or e-newsletter service. Do you have any? Kindly let me know in order that I could subscribe. Thanks.

  33. Thank you, I ave recently been looking for info about this subject for ages and yours is the greatest I ave discovered till now. But, what about the bottom line? Are you sure about the source?

  34. Usually I don at learn post on blogs, however I would like to say that this write-up very forced me to take a look at and do it! Your writing style has been amazed me. Thank you, quite nice article.

  35. Your style is unique in comparison to other people I ave read stuff from. Thank you for posting when you ave got the opportunity, Guess I will just book mark this web site.

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

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

  38. These kinds of Search marketing boxes normally realistic, healthy and balanced as a result receive just about every customer service necessary for some product. Link Building Services

  39. This awesome blog is definitely interesting and also amusing. I have picked up a bunch of helpful stuff out of this blog. I ad love to come back again soon. Thanks a bunch!

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

Please enter your comment!
Please enter your name here