Python sử dụng setter trong __init__

Python có nhiều tính năng và dễ bị choáng khi học. Hôm nay chúng ta sẽ chỉ tập trung tìm hiểu một trong những tính năng đó. người trang trí

class Human:
    def __init__(self, age):
        self.age = age

    def get_age(self):
        return self.age
3

Chúng tôi sẽ giải thích các thuộc tính là gì, tại sao bạn có thể muốn sử dụng chúng và nơi chúng phù hợp với cấu trúc lớp của Python

Khi học lập trình, thường có một đường cong học tập dốc sau khi bạn học những điều cơ bản. Có một khoảng cách lớn giữa hướng dẫn và các dự án trong thế giới thực. Trình trang trí

class Human:
    def __init__(self, age):
        self.age = age

    def get_age(self):
        return self.age
3 là một trong những tính năng mà bạn hiếm khi thấy trong hướng dẫn nhưng đôi khi điều đó có thể rất hữu ích

Tài sản là gì?

Các thuật ngữ như

class Human:
    def __init__(self, age):
        self.age = age

    def get_age(self):
        return self.age
5 và
class Human:
    def __init__(self, age):
        self.age = age

    def get_age(self):
        return self.age
6 thường được sử dụng xung quanh khi thảo luận về ngôn ngữ lập trình. Thật hữu ích khi làm chậm lại để xác định ý nghĩa thực sự của từng thuật ngữ trong Python

Một thuộc tính là một biến dành riêng cho một đối tượng lớp. Nếu bạn không biết "đối tượng" là gì, hãy xem bài viết này để xem xét nhanh. Ví dụ: nếu bạn có một lớp tên là

class Human:
    def __init__(self, age):
        self.age = age

    def get_age(self):
        return self.age
7, một thuộc tính sẽ là bất kỳ biến nào tồn tại trên mỗi đối tượng của lớp đó. Bạn tạo các thuộc tính bằng cách sử dụng từ khóa
class Human:
    def __init__(self, age):
        self.age = age

    def get_age(self):
        return self.age
8. "Thuộc tính" chỉ là tên chúng ta đặt cho các biến thuộc về một lớp. Đây là một ví dụ, sử dụng lớp
class Human:
    def __init__(self, age):
        self.age = age

    def get_age(self):
        return self.age
7

class Human:
    def __init__(self, age):
        self.age = age

class Human:
    def __init__(self, age):
        self.age = age

    def get_age(self):
        return self.age

    def set_age(self, new_age):
        self.age = new_age

    age = property(get_age, set_age)
0 đề cập đến thuộc tính hiện có trên các đối tượng của lớp
class Human:
    def __init__(self, age):
        self.age = age

    def get_age(self):
        return self.age
7. Chúng ta có thể thiết lập nhiều thuộc tính, tùy thuộc vào những gì chúng ta cần các đối tượng lớp có. Ví dụ: chúng ta có thể đặt
class Human:
    def __init__(self, age):
        self.age = age

    def get_age(self):
        return self.age

    def set_age(self, new_age):
        self.age = new_age

    age = property(get_age, set_age)
2 hoặc
class Human:
    def __init__(self, age):
        self.age = age

    def get_age(self):
        return self.age

    def set_age(self, new_age):
        self.age = new_age

    age = property(get_age, set_age)
3 làm thuộc tính của các đối tượng của lớp
class Human:
    def __init__(self, age):
        self.age = age

    def get_age(self):
        return self.age
7

Một phương thức là một chức năng thuộc về một lớp. Ví dụ, trong lớp có tên là

class Human:
    def __init__(self, age):
        self.age = age

    def get_age(self):
        return self.age
7, một phương thức sẽ là bất kỳ hàm nào tồn tại bên trong lớp đó. Đây là một ví dụ, sử dụng lớp
class Human:
    def __init__(self, age):
        self.age = age

    def get_age(self):
        return self.age
7 của chúng tôi

class Human:
    def __init__(self, age):
        self.age = age

    def get_age(self):
        return self.age

Hàm

class Human:
    def __init__(self, age):
        self.age = age

    def get_age(self):
        return self.age

    def set_age(self, new_age):
        self.age = new_age

    age = property(get_age, set_age)
7 được gọi là "một phương thức trên lớp Human". Quan trọng. Các phương thức luôn nhận đối số
class Human:
    def __init__(self, age):
        self.age = age

    def get_age(self):
        return self.age
8 làm tham số đầu tiên của chúng. Điều này là do các phương thức luôn được kết nối với một lớp. Trong trường hợp này,
class Human:
    def __init__(self, age):
        self.age = age

    def get_age(self):
        return self.age

    def set_age(self, new_age):
        self.age = new_age

    age = property(get_age, set_age)
7 được gọi là "phương thức thể hiện" và sẽ luôn nhận đối tượng mà nó đang được gọi làm đối số đầu tiên. Để tìm hiểu thêm về từng loại phương pháp, hãy xem bài viết này

Thuộc tính là một loại thuộc tính đặc biệt. Nó là một thuộc tính có hai phương thức được gán cho nó. một "getter" và một "setter". Hãy xem xét một số mã để giải thích thêm

________số 8

Như bạn có thể thấy, chúng tôi đang sử dụng nhiều mã giống nhau. Chúng tôi đã đưa vào một hàm "setter" mới có tên là

class Human:
    def __init__(self, age):
        self.age = age

    def get_age(self):
        return self.age
00, sau đó chúng tôi xác định biến
class Human:
    def __init__(self, age):
        self.age = age

    def get_age(self):
        return self.age
01 là một thuộc tính của lớp, với getter là
class Human:
    def __init__(self, age):
        self.age = age

    def get_age(self):
        return self.age

    def set_age(self, new_age):
        self.age = new_age

    age = property(get_age, set_age)
7 và setter là
class Human:
    def __init__(self, age):
        self.age = age

    def get_age(self):
        return self.age
00. Đó là những gì chức năng
class Human:
    def __init__(self, age):
        self.age = age

    def get_age(self):
        return self.age
04 đang làm. nó nhận một getter cho tham số đầu tiên, một setter cho tham số thứ hai và tạo một biến thuộc tính trên lớp, nó lưu trữ trong tên mà bạn gán

Các thuộc tính trên các lớp rất hữu ích vì chúng cho phép chúng ta thực hiện một số xử lý động trên các thuộc tính khi chúng ta lấy hoặc đặt chúng. Ví dụ: nếu lớp của bạn có thuộc tính

class Human:
    def __init__(self, age):
        self.age = age

    def get_age(self):
        return self.age
01, nhưng bạn muốn đảm bảo rằng giá trị tuổi luôn được tính theo tháng, bạn có thể đảm bảo điều đó bằng cách đặt thuộc tính
class Human:
    def __init__(self, age):
        self.age = age

    def get_age(self):
        return self.age
01 thành thuộc tính. Kiểm tra mã này để xem ý tôi là gì

class Human:
    def __init__(self, age):
        self.age = age

    def get_age(self):
        return self.age
0

người trang trí

Để hợp lý hóa hơn nữa quá trình tạo thuộc tính, chúng tôi sẽ sử dụng trình trang trí

class Human:
    def __init__(self, age):
        self.age = age

    def get_age(self):
        return self.age
3. Nếu bạn chưa từng sử dụng/thấy các công cụ trang trí, hãy theo dõi khóa học nhỏ của chúng tôi để bắt kịp tốc độ một cách nhanh chóng

Trình trang trí

class Human:
    def __init__(self, age):
        self.age = age

    def get_age(self):
        return self.age
3 hoạt động như một lối tắt để sử dụng hàm
class Human:
    def __init__(self, age):
        self.age = age

    def get_age(self):
        return self.age
04 mà chúng tôi đã sử dụng trước đó. Trên hết, nó làm cho mã sạch hơn một chút. Ngoài ra, trình trang trí
class Human:
    def __init__(self, age):
        self.age = age

    def get_age(self):
        return self.age
3 thực thi trước khi khởi tạo lớp, do đó không có cơ hội vô tình sử dụng thuộc tính trước khi nó trở thành thuộc tính. Hãy đi sâu vào bằng cách kiểm tra mã này

class Human:
    def __init__(self, age):
        self.age = age

    def get_age(self):
        return self.age
2

Ở đây, chúng tôi sử dụng các công cụ trang trí trên các hàm getter và setter của chúng tôi, mà chúng tôi hiện đã đổi tên thành tên của thuộc tính. Hãy đi qua từng cái một cách cụ thể

Phương thức getter,

class Human:
    def __init__(self, age):
        self.age = age

    def get_age(self):
        return self.age
01, là phương thức áp dụng trình trang trí
class Human:
    def __init__(self, age):
        self.age = age

    def get_age(self):
        return self.age
3 cho nó. Chúng ta có thể sử dụng điều này để định dạng và thay đổi kết quả đầu ra của getter mỗi khi thuộc tính được tham chiếu

Nhưng vì

class Human:
    def __init__(self, age):
        self.age = age

    def get_age(self):
        return self.age
01 là một hàm, nên chúng ta vẫn cần lưu trữ giá trị của tuổi con người ở đâu đó. Đó là lúc thuộc tính
class Human:
    def __init__(self, age):
        self.age = age

    def get_age(self):
        return self.age
24 phát huy tác dụng

Khi một đối tượng của lớp

class Human:
    def __init__(self, age):
        self.age = age

    def get_age(self):
        return self.age
7 được khởi tạo, phương thức
class Human:
    def __init__(self, age):
        self.age = age

    def get_age(self):
        return self.age
26 sẽ chạy. Điều này đặt thuộc tính
class Human:
    def __init__(self, age):
        self.age = age

    def get_age(self):
        return self.age
01 trên đối tượng
class Human:
    def __init__(self, age):
        self.age = age

    def get_age(self):
        return self.age
8. Bởi vì chúng tôi đã viết một trình thiết lập tùy chỉnh cho thuộc tính
class Human:
    def __init__(self, age):
        self.age = age

    def get_age(self):
        return self.age
01, trình thiết lập tùy chỉnh sẽ chạy

Trong trình thiết lập tùy chỉnh, chúng tôi lấy giá trị

class Human:
    def __init__(self, age):
        self.age = age

    def get_age(self):
        return self.age
01 đến và đặt thuộc tính
class Human:
    def __init__(self, age):
        self.age = age

    def get_age(self):
        return self.age
24 trên đối tượng
class Human:
    def __init__(self, age):
        self.age = age

    def get_age(self):
        return self.age
8. Tại thời điểm này, bằng cách sử dụng trình thiết lập, chúng tôi có thể kiểm soát nhiều hơn cách đặt thuộc tính
class Human:
    def __init__(self, age):
        self.age = age

    def get_age(self):
        return self.age
24

Khi phương thức

class Human:
    def __init__(self, age):
        self.age = age

    def get_age(self):
        return self.age
26 chạy xong, đối tượng sẽ có

  • Thuộc tính
    class Human:
        def __init__(self, age):
            self.age = age
    
        def get_age(self):
            return self.age
    
    24 chứa giá trị được truyền vào khi đối tượng được tạo
  • Một tài sản
    class Human:
        def __init__(self, age):
            self.age = age
    
        def get_age(self):
            return self.age
    
    01 mà
    • Khi được truy cập gọi phương thức
      class Human:
          def __init__(self, age):
              self.age = age
      
          def get_age(self):
              return self.age
      
      3
    • Khi thay đổi sử dụng phương pháp
      class Human:
          def __init__(self, age):
              self.age = age
      
          def get_age(self):
              return self.age
      
      08
  • Một thuộc tính
    class Human:
        def __init__(self, age):
            self.age = age
    
        def get_age(self):
            return self.age
    
    09 có thể được truy cập nhưng không thể thay đổi giá trị của nó (vì không có trình thiết lập cho nó)

Để hiển thị những gì tôi muốn nói, hãy xem xét đoạn mã sau

class Human:
    def __init__(self, age):
        self.age = age

    def get_age(self):
        return self.age
0

Bạn nghĩ cái này sẽ in cái gì?

Điều này sẽ xuất ra như sau

class Human:
    def __init__(self, age):
        self.age = age

    def get_age(self):
        return self.age
3

Trang trí chức năng getter bằng trình trang trí

class Human:
    def __init__(self, age):
        self.age = age

    def get_age(self):
        return self.age
3 cho phép chúng tôi thay đổi cách tài sản sẽ được phục vụ cho bất kỳ ai gọi nó. Ví dụ: tôi có thể sử dụng mã để trả về số tháng tương đương với độ tuổi bằng cách tạo một thuộc tính khác,
class Human:
    def __init__(self, age):
        self.age = age

    def get_age(self):
        return self.age
09

class Human:
    def __init__(self, age):
        self.age = age

    def get_age(self):
        return self.age
6

Bây giờ, bất cứ khi nào biến

class Human:
    def __init__(self, age):
        self.age = age

    def get_age(self):
        return self.age
32 được gọi, nó sẽ trả về

class Human:
    def __init__(self, age):
        self.age = age

    def get_age(self):
        return self.age
8

Hãy đi sâu vào setter. Bây giờ chúng ta đã xác định một thuộc tính bằng cách sử dụng trình trang trí

class Human:
    def __init__(self, age):
        self.age = age

    def get_age(self):
        return self.age
3, chúng ta có thể viết một trình thiết lập cho nó bằng cách sử dụng
class Human:
    def __init__(self, age):
        self.age = age

    def get_age(self):
        return self.age
34. Hãy nhớ thay thế
class Human:
    def __init__(self, age):
        self.age = age

    def get_age(self):
        return self.age
35 bằng tên thuộc tính thực tế bên trong lớp học của bạn. Hãy xem cách chúng tôi đã làm điều này trong lớp
class Human:
    def __init__(self, age):
        self.age = age

    def get_age(self):
        return self.age
7

class Human:
    def __init__(self, age):
        self.age = age

    def get_age(self):
        return self.age
3

Bộ thiết lập trên thuộc tính

class Human:
    def __init__(self, age):
        self.age = age

    def get_age(self):
        return self.age
01 được trang trí bằng bộ trang trí
class Human:
    def __init__(self, age):
        self.age = age

    def get_age(self):
        return self.age
08, cho phép chúng tôi sửa đổi cách cho phép đặt thuộc tính này. Ví dụ: chúng ta có thể hạn chế tuổi của ai đó chỉ ở dạng số nguyên bằng cách thực hiện điều này

class Human:
    def __init__(self, age):
        self.age = age

    def get_age(self):
        return self.age
0

Bây giờ, nếu chúng ta thử chạy đoạn mã sau

class Human:
    def __init__(self, age):
        self.age = age

    def get_age(self):
        return self.age
1

Đây là những gì đầu ra sẽ được

class Human:
    def __init__(self, age):
        self.age = age

    def get_age(self):
        return self.age
2

Vì vậy, bạn có thể thấy rằng chức năng thiết lập tùy chỉnh của chúng tôi sẽ ngăn không cho bất kỳ thứ gì ngoại trừ số nguyên được đặt vào thuộc tính

class Human:
    def __init__(self, age):
        self.age = age

    def get_age(self):
        return self.age
01. Bởi vì chúng tôi đã đưa ra TypeError, chương trình sẽ ngừng chạy bất cứ khi nào chúng tôi cố gắng đặt một giá trị không nguyên trên thuộc tính tuổi. Thông báo lỗi được hiển thị cùng với dấu vết cho chúng tôi biết nơi xảy ra lỗi

Phần kết luận

Có một trình trang trí

class Human:
    def __init__(self, age):
        self.age = age

    def get_age(self):
        return self.age
3 một cách ngắn gọn. Nói chung, đó là một cách rất hiệu quả để giành quyền kiểm soát nhiều hơn đối với cách các thuộc tính được đặt và định dạng bên trong các lớp của bạn. Bằng cách sử dụng trình thu thập tùy chỉnh, bạn có thể sửa đổi cách trình bày các thuộc tính. Bằng cách sử dụng trình cài đặt tùy chỉnh, bạn có thể kiểm soát cách từng thuộc tính được phép đặt

Nếu bạn muốn tìm hiểu thêm về Python, hãy cân nhắc đăng ký Khóa học Python hoàn chỉnh của chúng tôi, khóa học này sẽ đưa bạn từ người mới bắt đầu đến nâng cao (bao gồm OOP, phát triển web, phát triển không đồng bộ, v.v. ). Chúng tôi có bảo đảm hoàn lại tiền trong 30 ngày, vì vậy bạn thực sự không mất gì khi dùng thử. Chúng tôi muốn có bạn

Bạn có nên sử dụng setters trong Python không?

Mặc dù mẫu getter và setter khá phổ biến trong các ngôn ngữ lập trình khác, nhưng đó không phải là trường hợp trong Python. Việc thêm các phương thức getter và setter vào lớp học của bạn có thể làm tăng đáng kể số dòng trong mã của bạn .

Cách Pythonic nhất để sử dụng getter và setter là gì?

Getters và Setters trong python thường được sử dụng khi. .
Chúng tôi sử dụng getters và setters để thêm logic xác thực xung quanh việc nhận và đặt giá trị
Để tránh truy cập trực tiếp vào một trường lớp tôi. e. các biến riêng tư không thể được truy cập trực tiếp hoặc sửa đổi bởi người dùng bên ngoài

Điều gì sẽ xảy ra nếu getters và setters được đặt ở chế độ riêng tư?

Các phương thức getter/setter riêng tư cung cấp một nơi để thêm mã kiểm tra lỗi hoặc hành vi bổ sung . Họ có thể cung cấp một nơi để ghi lại các thay đổi trạng thái hoặc truy cập vào các trường.

Mối liên hệ giữa các phương thức đóng gói và getter và setter là gì?

Đóng gói có nghĩa là ngăn các đối tượng khác sửa đổi trực tiếp các giá trị. Nếu bạn đặt getters và setters ở chế độ riêng tư, chỉ các phương thức khác trong lớp đó mới có thể gọi chúng .