Hàm Ma Trợ trong Python

Hàm ma trợ (Magic Methods) là các phương thức được Python định nghĩa sẵn, có dạng "__tên_phương_thức__". Chúng không cần được gọi trực tiếp mà được gọi bởi trình thông dịch Python khi thực hiện các thao tác cụ thể. Hầu hết các hàm ma trợ đều có một hàm dựng sẵn hoặc toán tử tương ứng.

1. Phương thức __init__

Khi khởi tạo đối tượng, phương thức __init__ sẽ được gọi.

class VíDụ:
    def __init__(self, tên, tuổi):
        self.tên = tên
        self.tuổi = tuổi
        print("Tên: " + self.tên)
        print("Tuổi: " + self.tuổi)

if __name__ == '__main__':
    đối_tượng = VíDụ("Nguyễn Văn A", "25")
# Kết quả:
# Tên: Nguyễn Văn A
# Tuổi: 25

2. Phương thức __new__

Phương thức __new__ được gọi trước __init__ để cấp phát bộ nhớ cho đối tượng.

class VíDụ:
    def __new__(cls, *args, **kwargs):
        print("Đây là phương thức __new__")
        đối_tượng = super(VíDụ, cls).__new__(cls)
        print(đối_tượng)
        return đối_tượng

    def __init__(self):
        print("Đây là phương thức __init__")

if __name__ == '__main__':
    đối_tượng = VíDụ()
# Kết quả:
# Đây là phương thức __new__
# <__main__.VíDụ object at 0x123456789>
# Đây là phương thức __init__

3. Phương thức __str__

Khi in đối tượng, phương thức __str__ sẽ được gọi.

class VíDụ:
    def __str__(self):
        return "Đây là tên của đối tượng"

if __name__ == '__main__':
    đối_tượng = VíDụ()
    print(đối_tượng)
# Kết quả:
# Đây là tên của đối tượng

4. Phương thức __del__

Phương thức __del__ được gọi khi đối tượng bị xóa.

class VíDụ:
    def __init__(self):
        print("Khởi tạo đối tượng")

    def __del__(self):
        print("Đối tượng bị xóa")

if __name__ == '__main__':
    đối_tượng = VíDụ()
    print("Kết thúc chương trình")
# Kết quả:
# Khởi tạo đối tượng
# Kết thúc chương trình
# Đối tượng bị xóa

5. Phương thức __call__

Khi gọi đối tượng như một hàm, phương thức __call__ sẽ được thực thi.

class VíDụ:
    def __call__(self):
        print("Gọi phương thức __call__")

if __name__ == '__main__':
    đối_tượng = VíDụ()
    đối_tượng()
# Kết quả:
# Gọi phương thức __call__

6. Phương thức __len__

Khi sử dụng hàm len(), phương thức __len__ sẽ được gọi.

class VíDụ:
    def __init__(self, tên, tuổi):
        self.tên = tên
        self.tuổi = tuổi

    def __len__(self):
        return len(self.__dict__)

if __name__ == '__main__':
    đối_tượng = VíDụ("Nguyễn Văn A", 25)
    print(len(đối_tượng))
# Kết quả:
# 2

7. Phương thức __eq__

Khi so sánh bằng toán tử ==, phương thức __eq__ sẽ được gọi.

class VíDụ:
    def __init__(self, tên, tuổi):
        self.tên = tên
        self.tuổi = tuổi

    def __eq__(self, khác):
        return self.tuổi == khác.tuổi

if __name__ == '__main__':
    đối_tượng1 = VíDụ("Nguyễn Văn A", 25)
    đối_tượng2 = VíDụ("Nguyễn Văn B", 25)
    print(đối_tượng1 == đối_tượng2)
# Kết quả:
# True

8. Phương thức __hash__

Khi sử dụng hàm hash(), phương thức __hash__ sẽ được gọi.

class VíDụ:
    def __init__(self, tên, tuổi):
        self.tên = tên
        self.tuổi = tuổi

    def __hash__(self):
        return hash(self.tên)

if __name__ == '__main__':
    đối_tượng = VíDụ("Nguyễn Văn A", 25)
    print(hash(đối_tượng))
# Kết quả:
# 1234567890123456789 (số này có thể thay đổi tùy môi trường)

9. Phương thức __getitem__

Khi truy cập thuộc tính qua chỉ mục, phương thức __getitem__ sẽ được gọi.

class VíDụ:
    def __init__(self, tên, tuổi):
        self.tên = tên
        self.tuổi = tuổi

    def __getitem__(self, mục):
        return self.__dict__[mục]

if __name__ == '__main__':
    đối_tượng = VíDụ("Nguyễn Văn A", 25)
    print(đối_tượng['tên'])
# Kết quả:
# Nguyễn Văn A

10. Phương thức __setitem__

Khi gán giá trị cho thuộc tính thông qua chỉ mục, phương thức __setitem__ sẽ được gọi.

class VíDụ:
    def __init__(self, tên):
        self.tên = tên

    def __setitem__(self, khóa, giá_trị):
        self.__dict__[khóa] = giá_trị

if __name__ == '__main__':
    đối_tượng = VíDụ("Nguyễn Văn A")
    đối_tượng['tuổi'] = 25
    print(đối_tượng.__dict__)
# Kết quả:
# {'tên': 'Nguyễn Văn A', 'tuổi': 25}

11. Phương thức __delitem__

Khi xóa thuộc tính thông qua chỉ mục, phương thức __delitem__ sẽ được gọi.

class VíDụ:
    def __init__(self, tên):
        self.tên = tên

    def __delitem__(self, khóa):
        del self.__dict__[khóa]

if __name__ == '__main__':
    đối_tượng = VíDụ("Nguyễn Văn A")
    đối_tượng['tuổi'] = 25
    del đối_tượng['tuổi']
    print(đối_tượng.__dict__)
# Kết quả:
# {'tên': 'Nguyễn Văn A'}

12. Phương thức __delattr__

Khi xóa thuộc tính thông qua tên thuộc tính, phương thức __delattr__ sẽ được gọi.

class VíDụ:
    def __init__(self, tên):
        self.tên = tên

    def __delattr__(self, tên_thuộc_tính):
        del self.__dict__[tên_thuộc_tính]

if __name__ == '__main__':
    đối_tượng = VíDụ("Nguyễn Văn A")
    đối_tượng['tuổi'] = 25
    del đối_tượng.tên
    print(đối_tượng.__dict__)
# Kết quả:
# {'tuổi': 25}

Thẻ: python magic-methods object-oriented-programming

Đăng vào ngày 3 tháng 7 lúc 04:04