Class trong Python
Python là một ngôn ngữ lập trình hướng đối tượng. Hầu hết mọi thứ trong Python đều là một đối tượng, với các thuộc tính properties
và phương thức methods
.
Lớp Class trong Python kí hiệu là class
được hiểu như là một bản mẫu, bản mô tả về các đối tượng nào đó. Class (lớp, loài) chính là một định nghĩa, chứa tất cả các thông tin bao gồm thuộc tính – properties và hành vi – method, function của mọi cá thể (đối tượng – object) trong loài đó.
Ví dụ, chúng ta định nghĩa lớp car
thì lớp này sẽ phải bao gồm tất cả những thông tin, đặc điểm chung mà mọi chiếc ô tô đều có:
- các thuộc tính:
fuel
– loại nguyên liệu sử dụng,maxspeed
– tốc độ tối đa… - các hàm, phương thức:
refuel()
– nạp nhiên liệu,getFuel()
– lấy mức nhiên liệu hiện tại,setSpeed()
– thiết lập vận tốc là bao nhiêu, getSpeed() – lấy vận tốc hiện tại của xe,drive()
– lái xe…
Khi đó, giả sử myCar
là một object (đối tượng) của class car thì myCar
phải có đầy đủ các đặc điểm của lớp car với những thông số cụ thể. Chẳng hạn myCar.fuel
có giá trị là xăng
, myCar.maxSpeed
bằng 18o km/h, khi gọi hàm myCar.getFuel()
sẽ trả về mức nhiên liệu hiện tại của myCar
…
Đố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.
Xem thêm 15 Cuốn sách học Python miễn phí
Nếu bạn thấy khó hiểu thì nên nhớ rằng từ bản thân từ class
có nghĩa là loài, lớp. Nói đến loài mèo, chúng ta đều biết rằng tất cả các con mèo đều có các đặc điểm như màu lông, màu mắt, chiều dài, cân nặng… và các hành động như kêu meo meo, dụi lông vào chân, kêu gừ gừ… Do đó, chúng ta có thể dùng class LoaiMeo
để mô tả những đặc điểm này của loài mèo. Nhưng, đối với mỗi một con mèo cụ thể thì từng đặc điểm trên lại có các giá trị cụ thể khác nhau. Chẳng hạn con mèo Milu của tôi thì màu xám, cân nặng 2 kí, mắt xanh… còn con mèo Mimi của bạn thì lại màu trắng, cân nặng 3 kí và mắt nâu.
Các khái niệm trong class
- Instance là một hiện thực cụ thể của một lớp, có thể gọi là thực thể (cá thể). Chẳng hạn, với lớp
LoaiMeo
kể trên thì Milu là mộtinstance
củaLoaiMeo
. - Methods: Hàm, phương thức của một class.
- Data members: Biến chứa dữ liệu gồm: class variable và instance variable.
- Class variable: Biến dùng chung cho tất cả các đối tượng của lớp, được định nghĩa trong lớp mà không nằm trong methods (hàm thực thi) nào cả. Các biến này không được sử dụng thường xuyên.
- Instance variable: Biến được định nghĩa bên trong method và chỉ thuộc về các instance (đối tượng thực thể của lớp).
Khai báo Class trong Python
Khai báo lớp trong Python sử dụng từ khóa class
, theo sau là tên của lớp, thường bắt đầu bằng kí tự viết hoa và cuối cùng là kí tự :
Dòng tiếp theo, thường là comment sử dụng cặp ngoặ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.
Tiếp theo là các thuộc tính và các hàm, phương thức của lớp. Cấu trúc chung như sau:
class TenLop: '''Mô tả về class''' <các trường dữ liệu (data field)> <các hàm, phương thức>
Ví dụ, khai báo lớp MyClass
với thuộc tính a = 5
, chúng ta viết như sau:
class MyClass: '''Đây là docstring. Một lớp mới vừa được khai báo.''' a =5
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.
Tạo một đối tượng trong Python
Để tạo một đối tượng object của class, chẳng hạn lớp MyClass
chúng ta cần một biến để lưu đối tượng này và dùng phép gán, theo sau là lời gọi MyClass()
class MyClass: '''Đây là docstring. Một lớp mới vừa được khai báo.''' a =5 foo = MyClass()
Truy cập đến các thuộc tính, method của class
Để truy cập đến các thuộc tính, hàm, phương thức của lớp, chúng ta sử dụng dấu chấm .
sau tên lớp, tên đối tượng và theo sau là tên thuộc tính, tên hàm. Ví dụ, với lớp MyClass
ở trên, để truy cập đến thuộc tính a
, chúng ta dùng câu lệnh MyClass.a
hoặc foo.a
class MyClass: '''Đây là docstring. Một lớp mới vừa được khai báo.''' a =5 foo = MyClass() print(foo.a) //kết quả 5 print(MyClass.a) //kết quả 5
Chúng ta có thể thay đổi giá trị cho các thuộc tính của một đối tượng trong class sử dụng phép gán giá trị mới cho thuộc tính đó. Chẳng hạn, trong ví dụ trên, chúng ta muốn a
nhận giá trị 7
thì làm như sau
<pre class="EnlighterJSRAW" data-enlighter-language="python">class MyClass: '''Đây là docstring. Một lớp mới vừa được khai báo.''' a =5 foo = MyClass() print(foo.a) //kết quả 5 foo.a = 7 print(foo.a)//kết quả 7 print(MyClass.a) //kết quả 5
Lưu ý rằng, cùng là thuộc tính a
nhưng gắn với những đối tượng khác nhau thì sẽ là những đối tượng khác nhau. Chẳng hạn, cùng thuộc về lớp ConNguoi
, nhưng mỗi con người cụ thể sẽ có những tên, tuổi, đặc điểm không giống nhau.
Xóa bỏ thuộc tính và đối tượng
Ngoài việc đọc các giá trị, ghi các mới cho các trường của class hoặc gọi các hàm, phương thức của class, chúng ta có thể xóa các thuộc tính, các phương thức của một lớp, hoặc xóa một đối tượng của lớp. Để làm việc này, chúng ta sử dụng lệnh del
theo sau là tên lớp và tên thuộc tính, phương thức:
>>> class MyClass: ... a = 5 ... >>> foo = MyClass() >>> foo.a 5 >>> foo.a = 10 //gán giá trị 10 cho trường a của đối tượng foo >>> foo.a 10 >>> del foo.a //xóa giá trị trong trường a của đối tượng foo >>> foo.a 5 >>> del MyClass.a //xóa trường a của lớp MyClass >>> foo.a Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: 'MyClass' object has no attribute 'a'
Các phương thức method của class
Một class
ngoài các thuộc tính properties
còn có các hàm, phương thức methods
để thực hiện những công việc nào đó. Như trong lớp car
ở đầu bài viết thì các phương thức chính là refuel()
, getFuel()
, setSpeed()
…
Constructor Hàm __init__() trong Python
Tất cả các lớp đều có một hàm được gọi là __init __ ()
, hàm này luôn được thực thi mỗi khi một đối tượng của lớp được khởi tạo. Chúng ta sử dụng hàm __init __ ()
để cung cấp các giá trị khởi tạo cho các thuộc tính hoặc các thao tác khác cần thực hiện khi đối tượng được tạo.
Ví dụ sau, chúng ta tạo một lớp có tên Person
, sử dụng hàm __init __ ()
để gán giá trị cho trường tên name
và tuổi age
:
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
p1 = Person("PHƯƠNG", 34)
print(p1.name)
print(p1.age)
Self trong Python là gì?
Các hàm function,
phương thức method
trong mỗi lớp khi khai báo thì đều có tham số self
, tham số self
là một tham chiếu đến thể hiện hiện tại của lớp. Khi gọi thì bạn không cần vì Python sẽ tự động truyền instance vào biến self
đó. Như trong ví dụ sau, biến p1
khi được gọi hàm sayHeloo thì self
sẽ được tham chiếu đến chính biến p1
.
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def sayHeloo(self):
print("Hello my name is " + self.name)
p1 = Person("PHUONG", 34)
p1.sayHeloo()
Bạn hoàn toàn có thể sử dụng từ khác để thay thế từ self
, chẳng hạn từ yours
🙂
class Person:
def __init__(yours, name, age):
yours.name = name
yours.age = age
def sayHeloo(mine):
print("Hello my name is " + mine.name)
p1 = Person("PHUONG", 34)
p1.sayHeloo()
Static Methods
Static Methods (phương thức tĩnh) trong Python cũng tương tự như các phương thức chúng ta gặp từ đầu bài viết đến giờ, sự khác biệt duy nhất là phương thức tĩnh được liên kết với một lớp chứ không phải các đối tượng của lớp đó. Nghĩa là bạn sẽ gọi đến static method bằng tên class chứ không phải bằng tên đối tượng.
Điều này có nghĩa là một phương thức tĩnh có thể được gọi mà không cần đối tượng cho lớp đó. Điều này cũng có nghĩa là các phương thức tĩnh không thể sửa đổi trạng thái của một đối tượng vì chúng không bị ràng buộc với nó.
Cách tạo phương thức tĩnh trong Python
- Sử dụng hàm
staticmethod()
để biến một phương thức bình thường thành phương thức tĩnh; - Sử dụng từ khóa
@staticmethod
trước khi khai báo phương thức.
Dưới đây là ví dụ về cách tạo phương thức tĩnh thứ nhất:
class Calculator: def addNumbers(x, y): return x + y # create addNumbers static method Calculator.addNumbers = staticmethod(Calculator.addNumbers) print('Product:', Calculator.addNumbers(15, 110))
hoặc cách thứ hai
Trong bài viết tiếp theo, chúng ta sẽ lần lượt tìm hiểu các chủ đề khác về class trong Python như tính kế thừa, operator overloading, data encapsulation và private attributes… Mời các bạn đón xem.