CodeGym /Các khóa học /Python SELF VI /Tạo lớp và đối tượng

Tạo lớp và đối tượng

Python SELF VI
Mức độ , Bài học
Có sẵn

3.1 Tạo lớp

Tạo lớp trong Python là một phần quan trọng của lập trình hướng đối tượng (OOP). Lớp cho phép tạo ra các kiểu dữ liệu mới, có thể có các thuộc tính và phương thức riêng. Hãy cùng xem qua những khái niệm cơ bản và ví dụ về cách tạo lớp trong Python.

Khái niệm cơ bản

  • Lớp: mẫu để tạo đối tượng. Lớp xác định các thuộc tính và phương thức mà đối tượng của lớp đó sẽ có.
  • Đối tượng: một instance của lớp. Đối tượng có tất cả các thuộc tính và phương thức được định nghĩa trong lớp.
  • Thuộc tính: biến được liên kết với lớp hoặc đối tượng.
  • Phương thức: hàm được liên kết với lớp hoặc đối tượng.

Thuộc tính về bản chất là các biến nội bộ của đối tượng hoặc lớp. Phương thức là các hàm được định nghĩa bên trong lớp. Những thuật ngữ này xuất phát từ OOP và được sử dụng cùng với hàm và biến.

Để khai báo (tạo) một lớp mới, ta sử dụng từ khóa class. Cú pháp chung của thao tác này trông như sau:


class TênLớp:
    biến1 = giá_trị1
    biếnN = giá_trịN
          
    def hàm1(self):
        mã hàm
            
    def hàmM(self):
        mã hàm

Về cơ bản, có thể nói rằng lớp là một chương trình nhỏ (biến + hàm), được đặt trong một khu vực riêng có tên - TênLớp.

Sau khi bạn đã tạo lớp, bạn có thể tạo đối tượng (instance) của lớp đó. Mã này còn trông dễ dàng hơn:


biếnX = TênLớp()

Quan trọng! Tên biến và phương thức trong Python thường được viết bằng chữ thường. Tên lớp - chữ hoa. Cũng không sử dụng gạch dưới trong tên lớp. Nếu tên lớp phải có nhiều từ, mỗi từ sẽ viết hoa.

Nếu bạn muốn truy cập vào một biến lớp/đối tượng, thì mã này thường trông như sau:


biếnX.biến1 = 10
biếnX.hàmM()       

Nhưng có một số chi tiết phức tạp hơn, như sẽ nói dưới đây…

3.2 Làm việc với đối tượng

Cả lớp và instance của lớp (đối tượng của lớp) đều là các object, vì vậy cả hai có thể có biến và phương thức riêng.

Có hai loại biến:

  • Thuộc tính/Biến/Trường của lớp (class property)
  • Thuộc tính/Biến/Trường của đối tượng (object property)

Và có ba loại phương thức:

  • Phương thức/Hàm của lớp (class method)
  • Phương thức/Hàm của đối tượng (instance method)
  • Phương thức tĩnh (static method)

Phương thức khác nhau về cách khai báo và gọi chúng.

Phương thức của đối tượng

Khi khai báo phương thức đối tượng, bạn cần truyền vào tham số bắt buộc đầu tiên là self. Khi gọi phương thức, tham số này được truyền tham chiếu đến đối tượng (instance).


class MyClass:

    def instance_method(self):
        print(type(self))  # <class 'MyClass'>
                   

my_object = MyClass()
my_object.instance_method()
        

Trong ví dụ trên, khi hàm instance_method() bắt đầu thực thi, tham số self đã được truyền tham chiếu tới đối tượng my_object.

Phương thức của lớp

Khi khai báo phương thức của lớp, bạn cũng cần truyền vào tham số bắt buộc đầu tiên là cls. Khi gọi phương thức, tham số này được truyền tham chiếu tới đối tượng lớp (class object). Ngoài ra, phương thức của lớp cần được gắn thêm decorator classmethod, như trong ví dụ dưới đây:


class MyClass:
    def instance_method(self):
        print(type(self))  # <class 'MyClass'>
        
    @classmethod
    def class_method(cls):
        print(type(cls))  # <class 'type'>
                   

my_object = MyClass()
my_object.instance_method()
MyClass.class_method()
        

Trong ví dụ trên, khi hàm class_method() bắt đầu thực thi, tham số cls đã được truyền tham chiếu tới lớp MyClass.

Phương thức tĩnh

Khi khai báo phương thức tĩnh, bạn không cần truyền gì vào, nhưng nó cũng sẽ không thể truy cập vào dữ liệu nội bộ của lớp. Ngoài ra, phương thức cần được gắn thêm decorator staticmethod, như trong ví dụ dưới đây:


class MyClass:
    def instance_method(self):
        print(type(self))  # <class 'MyClass'>
        
    @classmethod
    def class_method(cls):
        print(type(cls))  # <class 'type'>
        
    @staticmethod
    def static_method():
        return "Phương thức này không phụ thuộc vào instance hay lớp"
                   
my_object = MyClass()
my_object.instance_method()
MyClass.class_method()
MyClass.static_method() 
        

Phương thức tĩnh được gọi rất giống với phương thức của lớp, nhưng tham chiếu đối tượng hay tham chiếu lớp đều không được truyền vào.

3.3 Biến lớp

Biến lớp

Để khai báo một biến (thuộc tính) của lớp, chỉ cần khai báo nó ở bất kỳ đâu trong lớp. Thông thường sẽ làm điều này ở đầu, trước khi khai báo các phương thức của lớp. Ví dụ:


class MyClass:
    attribute = "Tôi là thuộc tính của lớp"
        
    @classmethod
    def class_method(cls):
        print(cls.attribute)  # Tôi là thuộc tính của lớp
                  
my_object = MyClass()
MyClass.class_method()

Nếu bạn muốn đọc hoặc ghi giá trị vào một biến lớp, hãy sử dụng đối tượng cls.

Thực tế, có thể truy cập vào biến lớp thông qua tên của lớp:


class MyClass:
    attribute = "Tôi là thuộc tính của lớp"
        
    @classmethod
    def class_method(cls):
        print(MyClass.attribute)  # Tôi là thuộc tính của lớp
                  
my_object = MyClass()

print(MyClass.attribute)  # Tôi là thuộc tính của lớp

Biến/trường của đối tượng

Biến đối tượng (instance) - là các trường của đối tượng self. Bạn chỉ cần làm việc với chúng thông qua self.name. Đây chính là lý do đối tượng self được truyền vào mỗi phương thức của đối tượng.

Ví dụ:


class MyClass:
    attribute = "Tôi là thuộc tính của lớp"
        
    def set_name(self, name):
        self.name = name
        
    def print_name(self):
        print(self.name)    
                 
my_object = MyClass()
my_object.set_name("Trường đối tượng có tên là name") 
my_object.print_name()  # "Trường đối tượng có tên là name"
        

Mỗi lần bạn gọi phương thức đối tượng, tham chiếu đến đối tượng, trên đó bạn gọi phương thức, được truyền vào như tham số đầu tiên (self). Các phương thức khác nhau của đối tượng có thể truy cập dữ liệu chung thông qua việc sử dụng đối tượng self.

Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION