Setters, Getters và Deleters trong lập trình hướng đối tượng Python

Lập trình Hướng Đối Tượng với Python

5.0 (11 đánh giá)
Tạo bởi I Hate Python Team Cập nhật lần cuối 06:50 07-09-2021 20.552 lượt xem 7 bình luận
Tác giả/Dịch giả: I Hate Python Team
Học nhanh

Danh sách bài học

Setters, Getters và Deleters trong lập trình hướng đối tượng Python

Dẫn nhập

Ở các bài trước, bạn đọc đã tìm hiểu về CÁC PHƯƠNG THỨC ĐẶC BIỆT TRONG LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG PYTHON.

Còn ở bài này, bạn đọc sẽ biết tới một số những phương thức nữa, nhưng những phương thức này không hẳn gọi là phương thức. Đó là Setters, Getters, Deleters

Để cho bài này được giải thích một cách đơn giản. Bạn đọc tạo sẵn một class mới thay vì class Siêu Nhân mà chúng ta đã làm việc trong suốt series.

class Kter:
    def __init__(self, ho, ten):
        self.ho = ho
        self.ten = ten
        self.email = ho + '-' + ten + '@kteam.com'

Nội dung

Để theo dõi bài này một cách tốt nhất, bạn nên có có những kiến thức cơ bản về Python trong khóa LẬP TRÌNH PYTHON CƠ BẢN

Nếu bạn chưa có thời gian để học hết khóa trên thì hãy đảm bảo đã tìm hiểu những kiến thức sau đây

Và đương nhiên để học tiếp bài sau, bạn phải nắm vững kiến thức ở các bài trước: 

Trong bài này, Bạn và Kteam sẽ cùng tìm hiểu những nội dụng sau đây

  • Getter
  • Setter
  • Deleter

Getter

Giờ ta tạo một đối tượng như sau

kter_A = Kter("Tran", "Long")

 Ở lớp Kter, ta viết thêm một regular method

def ho_va_ten(self):
    return '{} {}'.format(self.ho, self.ten)

 Sau đó ta thử in một số thứ cơ bản

print(kter_A.ho)
print(kter_A.ten)
print(kter_A.email)
print(kter_A.ho_va_ten())

Kết quả:

Tran
Long
Tran-Long@kteam.com
Tran Long

 Giờ là lúc mà ta nghịch ngợm một tí, bằng cách trước khi in ra những thông tin, ta thử tay đổi họ và tên của đối tượng kter ta vừa tạo.

kter_A.ho = "Nguyen"
kter_A.ten = "Giau"

print(kter_A.ho)
print(kter_A.ten)
print(kter_A.email)
print(kter_A.ho_va_ten())

 Kết quả:

Nguyen
Giau
Tran-Long@kteam.com
Nguyen Giau

 Bạn đọc để ý, sau khi thay đổi lại họ và tên thì phương thức ho_va_ten trả lại họ và tên đúng như sau khi đã được thay đổi. Tuy nhiên về email thì lại không phải thế. Và dĩ  nhiên rồi, bạn muốn nó thay đổi thì nó cũng phải được đổi lại theo bằng “cách thủ công”.

Bạn muốn email cũng được thay đổi như ho_va_ten? Vậy thì ta viết cho nó một phương thức như ho_va_ten:

def email(self):
    return self.ho + '-' + self.ten + '@kteam.com'

 Dĩ nhiên khi có phương thức này rồi thì bạn nhớ xóa thuộc tính email được gán trong hàm constructor

Khi ta chạy đoạn code:

kter_A.ho = "Nguyen"
kter_A.ten = "Giau"

print(kter_A.ho)
print(kter_A.ten)
print(kter_A.email())
print(kter_A.ho_va_ten())

 Kết quả:

Nguyen
Giau
Nguyen-Giau@kteam.com
Nguyen Giau

 Nhưng bạn thấy một điều là, bản chất nhìn vào nó là một phương thức, thật không đúng với cái ban  đầu ta muốn rằng nó là một thuộc tính. Để nó trở thành một thuộc tính, thì ta làm một thao tác như tạo classmethod. Bạn đọc xem ví dụ:

@property
def email(self):
    return self.ho + '-' + self.ten + '@kteam.com'
@property
def ho_va_ten(self):
    return '{} {}'.format(self.ho, self.ten)

 Giờ đây, ta đã có hai thuộc tính là emailho_va_ten.

kter_A.ho = "Nguyen"
kter_A.ten = "Giau"

print(kter_A.ho)
print(kter_A.ten)
print(kter_A.email) # thuoc tinh nen khong can () nhu luc nay
print(kter_A.ho_va_ten

Kết quả:

Nguyen
Giau
Nguyen-Giau@kteam.com
Nguyen Giau

Setter

Nãy ta có một thuộc tính ho_va_ten sau khi sử dụng getter. Vậy giả sử ta muốn gán lại ho_va_ten thì chuyện gì xảy ra?

class Kter:
    def __init__(self, ho, ten):
        self.ho = ho
        self.ten = ten
    @property
    def email(self):
        return self.ho + '-' + self.ten + '@kteam.com'
    @property
    def ho_va_ten(self):
        return '{} {}'.format(self.ho, self.ten)

kter_A = Kter("Tran", "Long")

kter_A.ho_va_ten = "Nguyen Giau"

 Và kết quả là có lỗi vì nó mâu thuẫn với thuộc tính ho_va_ten của chúng ta. Vì sao mâu thuẫn? Bản chất ho_va_ten là một phương thức, không thể gán cho một giá trị ngang như vậy được. Vì lí do đó, setter đã được sinh ra, chúng ta hãy thêm phương thức này vào lớp:

class Kter:
    def __init__(self, ho, ten):
        self.ho = ho
        self.ten = ten
    @property
    def email(self):
        return self.ho + '-' + self.ten + '@kteam.com'
    @property
    def ho_va_ten(self):
        return '{} {}'.format(self.ho, self.ten)
    @ho_va_ten.setter
    def ho_va_ten(self, ten_moi):
        ho_moi, ten_moi = ten_moi.split(' ')
        self.ho = ho_moi
        self.ten = ten_moi

kter_A = Kter("Tran", "Long")

kter_A.ho_va_ten = "Nguyen Giau" # day la argument cho parameter ten_moi

print(kter_A.ho_va_ten)

 Kết quả:

Nguyen Giau

Deleter

Nếu bạn muốn dùng xong xóa, thì deleter là công cụ giúp bạn xóa những thuộc tính bạn vừa gán. Xóa ở đây là việc gán một giá trị rác (giá trị không có ý nghĩa) cho cái chúng ta muốn xóa. Và thường trong Python giá trị đó được sử dụng là None (đôi lúc là 0, hoặc là một list rỗng, tùy từng thuộc tính mà ta muốn xóa)

Cú pháp gần như tương tự với setter (deleter không sử dụng parameter nào khác ngoài parameter self). Ta thêm một deleter vào một lớp và sử dụng deleter như sau.

Mời bạn đọc xem ví dụ:

class Kter:
    def __init__(self, ho, ten):
        self.ho = ho
        self.ten = ten
    @property
    def email(self):
        return self.ho + '-' + self.ten + '@kteam.com'
    @property
    def ho_va_ten(self):
        return '{} {}'.format(self.ho, self.ten)
    @ho_va_ten.setter
    def ho_va_ten(self, ten_moi):
        ho_moi, ten_moi = ten_moi.split(' ')
        self.ho = ho_moi
        self.ten = ten_moi
    @ho_va_ten.deleter
    def ho_va_ten(self):
        self.ho = None
        self.ten = None
        print('Da xoa')

kter_A = Kter("Tran", "Long")

kter_A.ho_va_ten = "Nguyen Giau"

print(kter_A.ho_va_ten)

del kter_A.ho_va_ten

print(kter_A.ho)
print(kter_A.ten)

Kết quả:

Nguyen Giau
Da xoa
None
None

Kết luận

Bài này đã giúp bạn đọc tìm hiểu về getter, setter và deleter của một lớp

Như vậy chúng ta đã kết thúc series LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG PYTHON. Đây là những kiến thức nền tảng cơ bản (tuy không quá chuyên sâu) mà nhờ vào đó các bạn có thể tiếp tục học các model của Python một cách dễ dàng. Nếu bạn đọc có hứng thú về class trong Python nhiều thì có thể tìm hiểu siêu lớp (meta class) ở một số tài liệu trên mạng.

Cảm ơn các bạn đã theo dõi bài viết. Hãy để lại bình luận hoặc góp ý của mình để phát triển bài viết tốt hơn. Đừng quên “Luyện tập – Thử thách – Không ngại khó


Tải xuống

Tài liệu

Nhằm phục vụ mục đích học tập Offline của cộng đồng, Kteam hỗ trợ tính năng lưu trữ nội dung bài học Setters, Getters và Deleters trong lập trình hướng đối tượng Python dưới dạng file PDF trong link bên dưới.

Ngoài ra, bạn cũng có thể tìm thấy các tài liệu được đóng góp từ cộng đồng ở mục TÀI LIỆU trên thư viện Howkteam.com

Đừng quên likeshare để ủng hộ Kteam và tác giả nhé!


Thảo luận

Nếu bạn có bất kỳ khó khăn hay thắc mắc gì về khóa học, đừng ngần ngại đặt câu hỏi trong phần bên dưới hoặc trong mục HỎI & ĐÁP trên thư viện Howkteam.com để nhận được sự hỗ trợ từ cộng đồng.

Nội dung bài viết

Tác giả/Dịch giả

Chúng tôi là những người có niềm yêu thích Python và muốn Python được nhiều người biết đến hơn ở Việt Nam.

Khóa học

Lập trình Hướng Đối Tượng với Python

Nhắc đến lập trình hướng đối tượng, mọi người nghĩ ngay tới những Java, C++, C#,… Và bên cạnh đó, tuy không nhiều, nhưng vẫn được nhắn đến đó chính là chú trăn thanh lịch Python.

Ở khóa học này, Kteam sẽ giới thiệu với các bạn những kiến thức cơ bản về Lập trình hướng đối tượng trong Python một cách dễ hiểu, từ đó bạn có thể ứng dụng kiến thức hướng đối tượng khi tiếp xúc với các framework, package của Python.

Không những thế, bạn cũng sẽ dễ dàng tiếp cận sâu hơn về lập trình hướng đối tượng khác khi bạn chuyển đổi sang lập trình bằng ngôn ngữ khác, vì như đã nói, hướng đối tượng có ở hầu hết mọi ngôn ngữ hiện nay và được ứng dụng rất rộng rãi

Đánh giá

dqthuan123 đã đánh giá 11:09 13-09-2022

linhhng đã đánh giá 15:50 01-08-2022

hay

bui.mh đã đánh giá 15:50 27-04-2022

Duccter đã đánh giá 18:23 17-04-2022

i love coding đã đánh giá 18:26 20-03-2022

Nội dung hay, có điều hơi ít và khó hiểu, mong Kteam thêm video nữa!

Bình luận

Để bình luận, bạn cần đăng nhập bằng tài khoản Howkteam.

Đăng nhập
20116191 đã bình luận 21:31 29-07-2022

cho e  hỏi setter chỉ cho truyền 1 đối số hả mn

 

i love coding đã bình luận 18:32 20-03-2022

Đây là bài học cuối cùng về OOP python, cám ơn Kteam đã làm nhưng khóa học như thế này!

 

Color Pencil đã bình luận 23:14 06-09-2021

Hay quá Kteam! 

kiencuto77 đã bình luận 14:15 30-04-2021

def Kter:
    def __init__(self, ho, ten):
        self.ho = ho
        self.ten = ten
        self.email = ho + '-' + ten + '@kteam.com'
kteam lú quá rồi

sửa lại đi

B0T đã bình luận 15:40 25-06-2019

Trong phần Dẫn Nhập, thay vì ghi "class" lại bị sai thành "def"

Không có video.