Hướng dẫn how to access attributes of a class in python - cách truy cập các thuộc tính của một lớp trong python

Tôi đã có một cuộc phỏng vấn lập trình gần đây, một màn hình điện thoại trong đó chúng tôi đã sử dụng một trình soạn thảo văn bản hợp tác.

Tôi đã được yêu cầu thực hiện một API nhất định và chọn làm như vậy trong Python. Tóm tắt về tuyên bố vấn đề, hãy để nói rằng tôi cần một lớp có các trường hợp lưu trữ một số

class MyClass[object]:
    class_var = 1

    def __init__[self, i_var]:
        self.i_var = i_var
3 và một số
class MyClass[object]:
    class_var = 1

    def __init__[self, i_var]:
        self.i_var = i_var
4.

Tôi hít một hơi thật sâu và bắt đầu gõ. Sau một vài dòng, tôi đã có một cái gì đó như thế này:

class Service[object]:
    data = []

    def __init__[self, other_data]:
        self.other_data = other_data
    ...

Người phỏng vấn của tôi đã ngăn tôi lại:

  • Người phỏng vấn: Dòng đó:
    class MyClass[object]:
        class_var = 1
    
        def __init__[self, i_var]:
            self.i_var = i_var
    
    5. Tôi không nghĩ rằng, Python hợp lệ?
  • Tôi: Tôi đã rất chắc chắn. Nó chỉ đặt một giá trị mặc định cho thuộc tính thể hiện.
  • Người phỏng vấn: Khi nào mã đó được thực thi?
  • Tôi: Tôi không thực sự chắc chắn. Tôi chỉ cần sửa nó để tránh nhầm lẫn.

Để tham khảo và để cung cấp cho bạn một ý tưởng về những gì tôi sẽ làm, ở đây, cách tôi sửa đổi mã:

class Service[object]:

    def __init__[self, other_data]:
        self.data = []
        self.other_data = other_data
    ...

Hóa ra, cả hai chúng tôi đều sai. Câu trả lời thực sự nằm trong việc hiểu sự khác biệt giữa các thuộc tính lớp Python và các thuộc tính thể hiện Python.

Lưu ý: Nếu bạn có một chuyên gia xử lý các thuộc tính của lớp, bạn có thể bỏ qua trước để sử dụng các trường hợp.

Thuộc tính lớp Python

Người phỏng vấn của tôi đã sai ở chỗ mã trên có hiệu lực về mặt cú pháp.

Tôi cũng đã sai ở chỗ nó không phải là một giá trị mặc định của người dùng cho thuộc tính thể hiện. Thay vào đó, nó xác định

class MyClass[object]:
    class_var = 1

    def __init__[self, i_var]:
        self.i_var = i_var
3 là thuộc tính lớp có giá trị
class MyClass[object]:
    class_var = 1

    def __init__[self, i_var]:
        self.i_var = i_var
7.

Theo kinh nghiệm của tôi, các thuộc tính lớp Python là một chủ đề mà nhiều người biết điều gì đó, nhưng ít ai hiểu hoàn toàn.

Biến lớp Python so với biến thể hiện: Điều gì khác biệt?

Một thuộc tính lớp Python là một thuộc tính của lớp [tròn, tôi biết], thay vì một thuộc tính của một thể hiện của một lớp.

Hãy để sử dụng một ví dụ về lớp Python để minh họa sự khác biệt. Ở đây,

class MyClass[object]:
    class_var = 1

    def __init__[self, i_var]:
        self.i_var = i_var
8 là thuộc tính lớp và
class MyClass[object]:
    class_var = 1

    def __init__[self, i_var]:
        self.i_var = i_var
9 là một thuộc tính thể hiện:

class MyClass[object]:
    class_var = 1

    def __init__[self, i_var]:
        self.i_var = i_var

Lưu ý rằng tất cả các trường hợp của lớp đều có quyền truy cập vào

class MyClass[object]:
    class_var = 1

    def __init__[self, i_var]:
        self.i_var = i_var
8 và nó cũng có thể được truy cập dưới dạng thuộc tính của chính lớp:

foo = MyClass[2]
bar = MyClass[3]

foo.class_var, foo.i_var
## 1, 2
bar.class_var, bar.i_var
## 1, 3
MyClass.class_var ## 

Bài Viết Liên Quan

Chủ Đề