<!DOCTYPE html>
    <html lang="vi" xmlns="http://www.w3.org/1999/xhtml" prefix="og: http://ogp.me/ns#">
    <head>
<title>Lập trình hướng đối tượng trong Python</title>
<meta name="description" content="Lập trình hướng đối tượng trong Python - Savefile - Tin Tức -...">
<meta name="author" content=".: Nguoicodonvn2008.info - Cõi lòng người cô đơn :.">
<meta name="copyright" content=".: Nguoicodonvn2008.info - Cõi lòng người cô đơn :. [admin@nguoicodonvn2008.info]">
<meta name="robots" content="index, archive, follow, noodp">
<meta name="googlebot" content="index,archive,follow,noodp">
<meta name="msnbot" content="all,index,follow">
<meta name="generator" content="NukeViet v4.5">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta property="og:title" content="Lập trình hướng đối tượng trong Python">
<meta property="og:type" content="website">
<meta property="og:description" content="Savefile - Tin Tức - https&#x3A;&#x002F;&#x002F;www.nguoicodonvn2008.info&#x002F;vi&#x002F;news&#x002F;savefile&#x002F;kien-thuc-may-tinh&#x002F;lap-trinh-huong-doi-tuong-trong-python-10456.html">
<meta property="og:site_name" content=".&#x3A; Nguoicodonvn2008.info - Cõi lòng người cô đơn &#x3A;.">
<meta property="og:url" content="https://www.nguoicodonvn2008.info/vi/news/savefile/kien-thuc-may-tinh/lap-trinh-huong-doi-tuong-trong-python-10456.html">
<link rel="shortcut icon" href="https://www.nguoicodonvn2008.info/favicon.ico">
<link rel="canonical" href="https://www.nguoicodonvn2008.info/vi/news/savefile/kien-thuc-may-tinh/lap-trinh-huong-doi-tuong-trong-python-10456.html">
<link rel="alternate" href="https://www.nguoicodonvn2008.info/vi/news/rss/" title="Tin Tức" type="application/rss+xml">
<link rel="alternate" href="https://www.nguoicodonvn2008.info/vi/news/rss/karaoke-dual/" title="Tin Tức - Karaoke Dual" type="application/rss+xml">
<link rel="alternate" href="https://www.nguoicodonvn2008.info/vi/news/rss/nhac-tre/" title="Tin Tức - Nhạc trẻ" type="application/rss+xml">
<link rel="alternate" href="https://www.nguoicodonvn2008.info/vi/news/rss/tru-tinh/" title="Tin Tức - Trữ tình" type="application/rss+xml">
<link rel="alternate" href="https://www.nguoicodonvn2008.info/vi/news/rss/nuoc-ngoai/" title="Tin Tức - Nước ngoài" type="application/rss+xml">
<link rel="alternate" href="https://www.nguoicodonvn2008.info/vi/news/rss/remix/" title="Tin Tức - Remix" type="application/rss+xml">
<link rel="alternate" href="https://www.nguoicodonvn2008.info/vi/news/rss/tam-su-tinh-yeu/" title="Tin Tức - Tâm sự tình yêu" type="application/rss+xml">
<link rel="alternate" href="https://www.nguoicodonvn2008.info/vi/news/rss/tho-suu-tam/" title="Tin Tức - Thơ sưu tầm" type="application/rss+xml">
<link rel="alternate" href="https://www.nguoicodonvn2008.info/vi/news/rss/cuoc-song/" title="Tin Tức - Cuộc sống" type="application/rss+xml">
<link rel="alternate" href="https://www.nguoicodonvn2008.info/vi/news/rss/phan-mem/" title="Tin Tức - Phần mềm" type="application/rss+xml">
<link rel="alternate" href="https://www.nguoicodonvn2008.info/vi/news/rss/kien-thuc-may-tinh/" title="Tin Tức - Kiến thức máy tính" type="application/rss+xml">
<link rel="alternate" href="https://www.nguoicodonvn2008.info/vi/news/rss/hoc-tap/" title="Tin Tức - Học tập" type="application/rss+xml">
<link rel="alternate" href="https://www.nguoicodonvn2008.info/vi/news/rss/tai-lieu/" title="Tin Tức - Tài liệu" type="application/rss+xml">
<link rel="alternate" href="https://www.nguoicodonvn2008.info/vi/news/rss/de-thi/" title="Tin Tức - Đề thi" type="application/rss+xml">
<link rel="preload" as="style" href="https://www.nguoicodonvn2008.info/assets/css/font-awesome.min.css" type="text/css">
<link rel="preload" as="style" href="https://www.nguoicodonvn2008.info/themes/default/css/bootstrap.non-responsive.css" type="text/css">
<link rel="preload" as="style" href="https://www.nguoicodonvn2008.info/themes/default/css/style.css" type="text/css">
<link rel="preload" as="style" href="https://www.nguoicodonvn2008.info/themes/default/css/style.non-responsive.css" type="text/css">
<link rel="preload" as="style" href="https://www.nguoicodonvn2008.info/themes/default/css/news.css" type="text/css">
<link rel="preload" as="style" href="https://www.nguoicodonvn2008.info/themes/default/css/custom.css" type="text/css">
<link rel="preload" as="script" href="https://www.nguoicodonvn2008.info/assets/js/jquery/jquery.min.js" type="text/javascript">
<link rel="preload" as="script" href="https://www.nguoicodonvn2008.info/assets/js/language/vi.js" type="text/javascript">
<link rel="preload" as="script" href="https://www.nguoicodonvn2008.info/assets/js/DOMPurify/purify3.js" type="text/javascript">
<link rel="preload" as="script" href="https://www.nguoicodonvn2008.info/assets/js/global.js" type="text/javascript">
<link rel="preload" as="script" href="https://www.nguoicodonvn2008.info/assets/js/site.js" type="text/javascript">
<link rel="preload" as="script" href="https://www.nguoicodonvn2008.info/themes/default/js/news.js" type="text/javascript">
<link rel="preload" as="script" href="https://www.nguoicodonvn2008.info/themes/default/js/main.js" type="text/javascript">
<link rel="preload" as="script" href="https://www.nguoicodonvn2008.info/themes/default/js/custom.js" type="text/javascript">
<link rel="preload" as="script" href="https://www.nguoicodonvn2008.info/themes/default/js/bootstrap.min.js" type="text/javascript">
<link rel="stylesheet" href="https://www.nguoicodonvn2008.info/assets/css/font-awesome.min.css">
<link rel="stylesheet" href="https://www.nguoicodonvn2008.info/themes/default/css/bootstrap.non-responsive.css">
<link rel="stylesheet" href="https://www.nguoicodonvn2008.info/themes/default/css/style.css">
<link rel="stylesheet" href="https://www.nguoicodonvn2008.info/themes/default/css/style.non-responsive.css">
<link rel="StyleSheet" href="https://www.nguoicodonvn2008.info/themes/default/css/news.css">
<link rel="stylesheet" href="https://www.nguoicodonvn2008.info/themes/default/css/custom.css">
<style type="text/css">
	body{background: #fff;}
</style>
    </head>
    <body>
<div id="print">
	<div id="hd_print">
		<h2 class="pull-left">.&#x3A; Nguoicodonvn2008.info - Cõi lòng người cô đơn &#x3A;.</h2>
		<p class="pull-right"><a title=".&#x3A; Nguoicodonvn2008.info - Cõi lòng người cô đơn &#x3A;." href="https://www.nguoicodonvn2008.info/">https://www.nguoicodonvn2008.info</a></p>
	</div>
	<div class="clear"></div>
	<hr />
	<div id="content">
		<h1>Lập trình hướng đối tượng trong Python</h1>
		<ul class="list-inline">
			<li>Thứ năm - 29/05/2025 01:33</li>
			<li class="hidden-print txtrequired"><em class="fa fa-print">&nbsp;</em><a title="In ra" href="javascript:;" onclick="window.print()">In ra</a></li>
			<li class="hidden-print txtrequired"><em class="fa fa-power-off">&nbsp;</em><a title="Đóng cửa sổ này" href="javascript:;" onclick="window.close()">Đóng cửa sổ này</a></li>
		</ul>
		<div class="clear"></div>
		<div id="hometext">
		</div>
				<div class="imghome">
			<img alt="Lập trình hướng đối tượng trong Python" src="https://st.quantrimang.com/photos/image/2017/10/13/lenh-if-python-200-size-80x80-znd.jpg" width="460" class="img-thumbnail" />
		</div>
		<div class="clear"></div>
		<div id="bodytext" class="clearfix">
			<h1 style="text-align: justify;"><br />
<br />
<strong style="font-size: 13px;">Lập trình hướng đối tượng Python</strong><span style="font-size: 13px;">&nbsp;là gì? Dưới đây là mọi điều bạn cần biết về</span><strong style="font-size: 13px;">&nbsp;lập trình hướng đối tượng hay OOP trong Python</strong><span style="font-size: 13px;">.</span></h1>

<div style="text-align: justify;">&nbsp;</div>

<p style="text-align: justify;">Lập trình hướng đối tượng có một số ưu điểm so với các mẫu thiết kế khác. Phát triển nhanh hơn và rẻ hơn, với khả năng bảo trì phần mềm tốt hơn. Đổi lại, điều này dẫn đến phần mềm chất lượng cao hơn, cũng có thể mở rộng bằng các phương pháp và thuộc tính mới. Tuy nhiên, quá trình tìm hiểu nó cũng khó hơn. Khái niệm này có thể quá phức tạp đối với người mới bắt đầu. Về mặt tính toán, phần mềm OOP chậm hơn và sử dụng nhiều bộ nhớ hơn vì phải viết nhiều dòng mã hơn.</p>

<p style="text-align: justify;">Lập trình hướng đối tượng dựa trên mô hình lập trình bắt buộc, sử dụng các câu lệnh để thay đổi trạng thái của chương trình. Nó tập trung vào việc mô tả cách chương trình nên hoạt động. Ví dụ về ngôn ngữ lập trình bắt buộc là C, C++, Java, Go, Ruby và Python. Điều này trái ngược với lập trình khai báo, tập trung vào những gì chương trình&nbsp;&nbsp;máy tính&nbsp;nên thực hiện, mà không chỉ định cách thực hiện. Ví dụ là các ngôn ngữ truy vấn cơ sở dữ liệu như SQL và XQuery, trong đó người ta chỉ cho&nbsp;&nbsp;máy tính&nbsp;biết dữ liệu nào cần truy vấn từ đâu.</p>

<p style="text-align: justify;">Python&nbsp;là một trong số ngôn ngữ lập trình phổ biến nhất hiện nay. Bạn dễ dàng tìm thấy nó trong các ứng dụng, phần mềm hay trang web thông dụng. Điểm nổi bật của Python là nó có tính hướng đối tượng mạnh. Dưới đây là những điều bạn cần biết về lập trình hướng đối tượng trong Python.</p>

<h2 style="text-align: justify;">Giới thiệu về OOP trong Python</h2>

<p style="text-align: justify;">Lập trình hướng đối tượng Python (OOP) là một mô hình lập trình sử dụng các đối tượng và lớp trong lập trình. Nó nhằm mục đích triển khai các thực thể trong thế giới thực như kế thừa, đa hình, đóng gói, v.v. bằng lập trình. Khái niệm chính của OOP là liên kết dữ liệu và các chức năng hoạt động trên dữ liệu đó với nhau thành một đơn vị duy nhất để không phần nào khác của mã có thể truy cập dữ liệu này.</p>

<p style="text-align: justify;">Các khái niệm cơ bản trong lập trình Python hướng đối tượng:</p>

<ul>
	<li style="text-align: justify;">Class</li>
	<li style="text-align: justify;">Objects</li>
	<li style="text-align: justify;">Polymorphism</li>
	<li style="text-align: justify;">Encapsulation</li>
	<li style="text-align: justify;">Inheritance</li>
	<li style="text-align: justify;">Data Abstraction</li>
</ul>

<p style="text-align: justify;">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&#039;t Repeat Yourself).</p>

<p style="text-align: justify;">Một ví dụ về class là lớp Dog. Đừng nghĩ về nó như một con chó cụ thể, hoặc con chó của riêng bạn. Chúng ta đang mô tả một con chó là gì và có thể làm gì, nói chung. Chó thường có tên và tuổi; đây là các thuộc tính thể hiện. Chó cũng có thể sủa; đây là một phương thức.</p>

<p style="text-align: justify;">Khi bạn nói về một con chó cụ thể, bạn sẽ có một đối tượng trong lập trình: một đối tượng là một thể hiện của một lớp. Đây là nguyên tắc cơ bản mà lập trình hướng đối tượng dựa trên. Vì vậy, con chó Ozzy của tôi, ví dụ, thuộc về lớp Dog. Các thuộc tính của nó là name = &#039;Ozzy&#039; và age = &#039;2&#039;. Mỗi con chó khác nhau sẽ có các thuộc tính khác nhau.</p>

<p style="text-align: justify;">Giờ hãy cùng nhau tìm hiểu chi tiết nhé!</p>

<h2 style="text-align: justify;">Các nguyên lý</h2>

<p style="text-align: justify;">Trong Python, khái niệm về OOP tuân theo một số nguyên lý cơ bản là&nbsp;<em>tính đóng gói, tính kế thừa và tính đa hình</em>.</p>

<ul>
	<li style="text-align: justify;"><strong>Tính kế thừa (Inheritance)</strong>: 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.</li>
	<li style="text-align: justify;"><strong>Tính đóng gói (Encapsulation)</strong>: 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 đó).</li>
	<li style="text-align: justify;"><strong>Tính đa hình (Polymorphism)</strong><em>:</em>&nbsp;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.</li>
</ul>

<h2 style="text-align: justify;">Lớp (Class) và Đối tượng (Object)</h2>

<p style="text-align: justify;">Class và Object là hai khái niệm cơ bản trong lập trình hướng đối tượng.</p>

<p style="text-align: justify;"><strong>Đối tượng (Object)</strong>&nbsp;là những thực thể tồn tại có hành vi.</p>

<p style="text-align: justify;">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...</p>

<p style="text-align: justify;"><strong>Lớp (Class)</strong>&nbsp;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 đó.</p>

<p style="text-align: justify;">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 đó.</p>

<p style="text-align: justify;"><strong>Phân biệt giữa Đối tượng (Object) và Lớp (Class):</strong></p>

<p style="text-align: justify;"><em>Đối tượng (Object):</em>&nbsp;có trạng thái và hành vi.</p>

<p style="text-align: justify;"><em>Lớp (Class):</em>&nbsp;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</p>

<p style="text-align: justify;"><img alt="" data-i="0" data-src="https://st.quantrimang.com/photos/image/2018/11/30/OOP-1.jpg" data-was-processed="true" height="350" src="https://st.quantrimang.com/photos/image/2018/11/30/OOP-1.jpg" width="650" /></p>

<p style="text-align: justify;"><strong>Ví dụ về Class và Object:</strong></p>

<pre id="pre0" style="text-align: justify;">
class Car:

     # thuộc tính lớp
     loaixe = &quot;Ô tô&quot;

     # 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(&quot;Toyota&quot;, &quot;Đỏ&quot;, &quot;Điện&quot;)
lamborghini = Car(&quot;Lamborghini&quot;, &quot;Vàng&quot;, &quot;Deisel&quot;)
porsche = Car(&quot;Porsche&quot;, &quot;Xanh&quot;, &quot;Gas&quot;)

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

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

<p style="text-align: justify;">Kết quả trả về sẽ là:</p>

<pre id="pre1">
<code>Porsche là Ô tô.
Toyota là Ô tô.
Lamborghini cũng là Ô tô.
Xe Toyota có màu Đỏ. Điện là nguyên liệu vận hành.
Xe Lamborghini có màu Vàng. Deisel là nguyên liệu vận hành.
Xe Porsche có màu Xanh. Gas là nguyên liệu vận hành.
&gt; </code></pre>

<p style="text-align: justify;">Chương trình trên tạo một lớp&nbsp;<em>Car,</em>&nbsp;sau đó xác định các thuộc tính, đặc điểm của đối tượng</p>

<p style="text-align: justify;">Chúng ta truy cập thuộc tính class bằng cách sử dụng&nbsp;<em>__class __.loaixe.</em>&nbsp;Các thuộc tính lớp được chia sẻ cho tất cả các cá thể của lớp.</p>

<p style="text-align: justify;">Tương tự, chúng ta truy cập các thuộc tính instance bằng cách sử dụng&nbsp;<em>toyota.tenxe, toyota.mausac</em>&nbsp;và&nbsp;<em>toyota.nguyenlieu.</em></p>

<p style="text-align: justify;">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.</p>

<h3 style="text-align: justify;">So sánh class cha và class con</h3>

<p style="text-align: justify;">Ví dụ tạo một class con cho từng thành phần:</p>

<pre id="pre2" style="text-align: justify;">
class Dog:
species = &quot;Canis familiaris&quot;

def __init__(self, name, age):
self.name = name
self.age = age

def __str__(self):
return f&quot;{self.name} is {self.age} years old&quot;

def speak(self, sound):
return f&quot;{self.name} says {sound}&quot;</pre>

<p style="text-align: justify;">Nhớ rằng để tạo một class con, bạn tạo class mới bằng tên riêng của nó, rồi nhập tên class cha vào trong dấu ngoặc đơn. Thêm dòng sau vào file dog.py để tạo 3 class con mới cho class Dog:</p>

<pre id="pre3" style="text-align: justify;">
class JackRussellTerrier(Dog):
pass

class Dachshund(Dog):
pass

class Bulldog(Dog):
Pass</pre>

<p style="text-align: justify;">Nhấn F5 để lưu và chạy file. Với claas đã được xác định, giờ bạn có thể khởi tạo một số giống chó cụ thể trong cửa sổ tương tác:</p>

<pre id="pre4" style="text-align: justify;">
&gt;&gt;&gt; miles = JackRussellTerrier(&quot;Miles&quot;, 4)
&gt;&gt;&gt; buddy = Dachshund(&quot;Buddy&quot;, 9)
&gt;&gt;&gt; jack = Bulldog(&quot;Jack&quot;, 3)
&gt;&gt;&gt; jim = Bulldog(&quot;Jim&quot;, 5)</pre>

<p style="text-align: justify;">Các phiên bản của lớp con kế thừa tất cả các thuộc tính và phương thức của lớp cha:</p>

<pre id="pre5" style="text-align: justify;">
&gt;&gt;&gt; miles.species
&#039;Canis familiaris&#039;

&gt;&gt;&gt; buddy.name
&#039;Buddy&#039;

&gt;&gt;&gt; print(jack)
Jack is 3 years old

&gt;&gt;&gt; jim.speak(&quot;Woof&quot;)
&#039;Jim says Woof&#039;</pre>

<p style="text-align: justify;">Để xác định class một đối tượng được cung cấp thuộc về, bạn có thể dùng type() sau:</p>

<pre id="pre6" style="text-align: justify;">
&gt;&gt;&gt; type(miles)
&lt;class &#039;__main__.JackRussellTerrier&#039;&gt;</pre>

<p style="text-align: justify;">Nếu muốn xác định xem liệu miles có phải một phiên bản của class Dog? Bạn có thể làm việc này bằng isinstance():</p>

<pre id="pre7" style="text-align: justify;">
&gt;&gt;&gt; isinstance(miles, Dog)
True</pre>

<p style="text-align: justify;">Nhìn chung, toàn bộ đối tượng được tạo từ class con là các phiên bản của class cha, dù chúng có thể không phải phiên bản của class con khác.</p>

<p style="text-align: justify;"><strong>Điểm cần ghi nhớ về class</strong></p>

<ul>
	<li style="text-align: justify;">Class được tạo bởi class keyword (từ khóa).</li>
	<li style="text-align: justify;">Thuộc tính là biến thuộc về class.</li>
	<li style="text-align: justify;">Thuộc tính luôn công khai và có thể được truy cập bằng toán tử (.). Ví dụ: Myclass.Myattribute</li>
</ul>

<h2 style="text-align: justify;">Phương thức</h2>

<p style="text-align: justify;"><strong>Phương thức (Method)</strong>&nbsp;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.</p>

<p style="text-align: justify;"><strong>Ví dụ về Class và Method</strong></p>

<pre id="pre8" style="text-align: justify;">
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 &quot;{} đang dừng xe để {}&quot;.format(self.tenxe,mucdich)

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

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

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

# call our instance methods
print(toyota.dungxe(&quot;nạp điện&quot;))
print(lamborghini.chayxe())
print(porsche.nomay())</pre>

<p style="text-align: justify;">Chạy chương trình, màn hình sẽ trả về kết quả:</p>

<pre id="pre9">
<code>Toyota đang dừng xe để nạp điện
Lamborghini đang chạy trên đường
Porsche đang nổ máy</code></pre>

<p style="text-align: justify;">Ở ví dụ này, có ba phương thức là&nbsp;<em>dungxe(), chayxe()</em>&nbsp;và&nbsp;<em>nomay().</em>&nbsp;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&nbsp;<em>(toyota, lamborghini, porsche).</em></p>

<h2 style="text-align: justify;">Kế thừa (Inheritance)</h2>

<p style="text-align: justify;">Kế thừa là khả năng của một class để lấy hoặc kế thừa các thuộc tính từ một lớp khác. Lớp dẫn xuất các thuộc tính được gọi là lớp dẫn xuất hoặc lớp con và lớp mà từ đó các thuộc tính được dẫn xuất được gọi là lớp cơ sở hoặc lớp cha. Lợi ích của việc thừa kế là:</p>

<p style="text-align: justify;">Nó thể hiện tốt các mối quan hệ tại thế giới thực.</p>

<ul>
	<li style="text-align: justify;">Nó cung cấp khả năng tái sử dụng code. Bạn không phải viết lại code nhiều lần. Ngoài ra, nó cũng cho phép lập trình viên thêm nhiều tính năng hơn vào class mà không cần chỉnh sửa nó.</li>
	<li style="text-align: justify;">Về bản chất, nó có tính chất bắc cầu. Điều đó có nghĩa nếu class B kế thừa class A khác, thì tất cả class phụ của B sẽ tự động kế thừa A.</li>
</ul>

<p style="text-align: justify;"><strong>Các kiểu kế thừa:</strong></p>

<ul>
	<li style="text-align: justify;"><strong>Kế thừa đơn</strong>: Kế thừa một cấp cho phép lớp dẫn xuất kế thừa các đặc điểm từ lớp cha đơn.</li>
	<li style="text-align: justify;"><strong>Kế thừa đa cấp</strong>: Kế thừa đa cấp cho phép một lớp dẫn xuất kế thừa các thuộc tính từ lớp cha trực tiếp, từ đó kế thừa các thuộc tính từ lớp cha của nó.</li>
	<li style="text-align: justify;"><strong>Kế thừa theo thứ bậc</strong>: Kế thừa ở cấp độ thứ bậc cho phép nhiều lớp dẫn xuất kế thừa các thuộc tính từ một lớp cha.</li>
	<li style="text-align: justify;"><strong>Đa kế thừa</strong>: Kế thừa nhiều cấp cho phép một lớp dẫn xuất kế thừa các thuộc tính từ nhiều lớp cơ sở.</li>
</ul>

<pre id="pre10" style="text-align: justify;">
# 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 (&quot;{} đang chạy trên đường&quot;.format(self.tenxe))

     def dungxe(self, mucdich):
        print (&quot;{} đang dừng xe để {}&quot;.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 (&quot;{} đang chạy trên đường&quot;.format(self.tenxe))

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

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

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

toyota1.dungxe(&quot;nạp điện&quot;)
toyota2.chayxe()
toyota3.nomay()</pre>

<p style="text-align: justify;">Kết quả trả về:</p>

<pre id="pre11">
<code>Toyota Hilux đang dừng xe để nạp điện
Toyota Hilux chạy bằng Điện
Toyota Yaris đang chạy trên đường
Toyota Vios đang nổ máy</code></pre>

<p style="text-align: justify;">Chương trình này tạo hai lớp kế thừa: lớp cha&nbsp;<em>Car</em>&nbsp;và lớp con&nbsp;<em>Toyota.</em></p>

<p style="text-align: justify;">Khai báo constructor mới để gán giá trị vào thuộc tính của lớp cha. Hàm&nbsp;<em>super()</em>&nbsp;đứng trước phương thức&nbsp;<em>__init</em>&nbsp;__ để gọi tới nội dung&nbsp;<em>__init</em>&nbsp;__ của Car.</p>

<p style="text-align: justify;">Class Toyota kế thừa hàm&nbsp;<em>chayxe()</em>&nbsp;và&nbsp;<em>dungxe()</em>&nbsp;của class Car đồng thời sửa đổi một hành vi thể hiện ở phương thức&nbsp;<em>dungxe().</em>&nbsp;Sau đó lớp con bổ sung thêm thành phần mới là&nbsp;<em>nomay()</em>&nbsp;để mở rộng kế thừa.</p>

<h2 style="text-align: justify;">Đóng gói (Encapsulation)</h2>

<p style="text-align: justify;">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à&nbsp;<strong>đóng gói</strong>. 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 “__“.</p>

<pre id="pre12" style="text-align: justify;">
class Computer:

    def __init__(self):
        self.__maxprice = 900

    def sell(self):
        print(&quot;Giá bán sản phẩm là: {}&quot;.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 để thay đổi giá:
c.setMaxPrice(1000)
c.sell()</pre>

<p style="text-align: justify;">Màn hình hiển thị kết quả:</p>

<pre id="pre13">
<code>Giá bán sản phẩm là: 900
Giá bán sản phẩm là: 900
Giá bán sản phẩm là: 1000
&gt; </code></pre>

<p style="text-align: justify;">Ở ví dụ này, bạn khởi tạo class&nbsp;<a data-google-interstitial="false" data-google-vignette="false" href="https://quantrimang.com/hoc/lap-trinh-huong-doi-tuong-trong-python-160230#">&nbsp;Computer</a>, sử dụng&nbsp;<em>__init __()</em>&nbsp;để lưu trữ giá bán tối đa của&nbsp;<a data-google-interstitial="false" data-google-vignette="false" href="https://quantrimang.com/hoc/lap-trinh-huong-doi-tuong-trong-python-160230#">&nbsp;máy tính</a>. 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&nbsp;<em>__maxprice</em>&nbsp;là thuộc tính private. Vậy nên để thay đổi giá trị, ta sử dụng hàm setter setMaxPrice().</p>

<h2 style="text-align: justify;">Đa hình (Polymorphism)</h2>

<p style="text-align: justify;">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.</p>

<p style="text-align: justify;">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.</p>

<pre id="pre14" style="text-align: justify;">
class Toyota:

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

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

class Porsche:

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

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

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

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

# passing the object
kiemtra_dungxe(toyota)
kiemtra_dungxe(porsche)</pre>

<p style="text-align: justify;">Ở ví dụ này, bạn vừa tạo hai lớp&nbsp;<em>Toyota</em>&nbsp;và&nbsp;<em>Porsche,</em>&nbsp;cả hai lớp đều có phương thức&nbsp;<em>dungxe().</em>&nbsp;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à&nbsp;<em>kiemtra_dungxe().</em>&nbsp;Tiếp theo, bạn truyền đối tượng&nbsp;<em>toyota</em>&nbsp;và&nbsp;<em>porsche</em>&nbsp;vào hàm vừa tạo, và ta lấy được kết quả như này:</p>

<pre id="pre15">
<code>Toyota dừng xe để nạp điện
Porsche dừng xe để bơm xăng</code></pre>

<p style="text-align: justify;">Vậy là Quantrimang 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:</p>

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

<p style="text-align: justify;">Nhìn chung, lập trình hướng đối tượng là một khái niệm cơ bản trong Python, trao quyền cho các nhà phát triển xây dựng ứng dụng theo mô-đun, có thể bảo trì và mở rộng. Bằng cách hiểu các nguyên tắc cốt lõi của OOP (lớp, đối tượng, kế thừa, đóng gói, đa hình và trừu tượng), các lập trình viên có thể tận dụng toàn bộ tiềm năng OOP của Python để thiết kế các giải pháp thanh lịch và hiệu quả cho những vấn đề phức tạp.</p>
		</div>
				<div id="author">
						<p>
				<strong>Nguồn tin:</strong>
				Quantrimang.com:
			</p>
		</div>
	</div>
	<div id="footer" class="clearfix">
		<div id="url">
			<strong>URL của bản tin này: </strong><a href="https://www.nguoicodonvn2008.info/vi/news/savefile/kien-thuc-may-tinh/lap-trinh-huong-doi-tuong-trong-python-10456.html" title="Lập trình hướng đối tượng trong Python">https://www.nguoicodonvn2008.info/vi/news/savefile/kien-thuc-may-tinh/lap-trinh-huong-doi-tuong-trong-python-10456.html</a>

		</div>
		<div class="clear"></div>
		<div class="copyright">
			&copy; .&#x3A; Nguoicodonvn2008.info - Cõi lòng người cô đơn &#x3A;.
		</div>
		<div id="contact">
			<a href="mailto:admin@nguoicodonvn2008.info">admin@nguoicodonvn2008.info</a>
		</div>
	</div>
</div>
        <div id="timeoutsess" class="chromeframe">
            Bạn đã không sử dụng Site, <a onclick="timeoutsesscancel();" href="https://www.nguoicodonvn2008.info/#">Bấm vào đây để duy trì trạng thái đăng nhập</a>. Thời gian chờ: <span id="secField"> 60 </span> giây
        </div>
        <div id="openidResult" class="nv-alert" style="display:none"></div>
        <div id="openidBt" data-result="" data-redirect=""></div>
		</script>
		<div class="car-top">
  <span><img src="https://www.nguoicodonvn2008.info/themes/default/images/car.png" alt=""></span>
</div>
<script src="https://www.nguoicodonvn2008.info/assets/js/jquery/jquery.min.js"></script>
<script>var nv_base_siteurl="/",nv_lang_data="vi",nv_lang_interface="vi",nv_name_variable="nv",nv_fc_variable="op",nv_lang_variable="language",nv_module_name="news",nv_func_name="savefile",nv_is_user=0, nv_my_ofs=-4,nv_my_abbr="EDT",nv_cookie_prefix="nv4c_e856T",nv_check_pass_mstime=1738000,nv_area_admin=0,nv_safemode=0,theme_responsive=0,nv_recaptcha_ver=2,nv_recaptcha_sitekey="",nv_recaptcha_type="image",XSSsanitize=1;</script>
<script src="https://www.nguoicodonvn2008.info/assets/js/language/vi.js"></script>
<script src="https://www.nguoicodonvn2008.info/assets/js/DOMPurify/purify3.js"></script>
<script src="https://www.nguoicodonvn2008.info/assets/js/global.js"></script>
<script src="https://www.nguoicodonvn2008.info/assets/js/site.js"></script>
<script src="https://www.nguoicodonvn2008.info/themes/default/js/news.js"></script>
<script src="https://www.nguoicodonvn2008.info/themes/default/js/main.js"></script>
<script src="https://www.nguoicodonvn2008.info/themes/default/js/custom.js"></script>
<script type="application/ld+json">
        {
            "@context": "https://schema.org",
            "@type": "Organization",
            "url": "https://www.nguoicodonvn2008.info",
            "logo": "https://www.nguoicodonvn2008.info/uploads/angel.gif"
        }
        </script>
<script src="https://www.nguoicodonvn2008.info/themes/default/js/bootstrap.min.js"></script>
<script type="text/javascript">
var $scrolltop = $('.car-top');
$scrolltop.on('click', function () {
    $('html,body').animate({
        scrollTop: 0
    }, 800);
    $(this).addClass("car-run");
    setTimeout(function(){ $scrolltop.removeClass('car-run');}, 1000);
    return false;
});
$(window).on('scroll', function ()
{ 
    if($(window).scrollTop() >= 200)
    {
        $scrolltop.addClass("show");
        $scrolltop.addClass("car-down");
    }
    else
    {
       $scrolltop.removeClass("show");
       setTimeout(function(){ $scrolltop.removeClass('car-down');}, 300);
    }
});
</script>
</body>
</html>