Python gán phương thức lớp cho biến

Trong một màn hình điện thoại gần đây, tôi đã quyết định sử dụng một thuộc tính lớp để triển khai một API Python nhất định. Người phỏng vấn của tôi đã thách thức tôi, đặt câu hỏi liệu mã của tôi có hợp lệ về mặt cú pháp hay không, khi nó được thực thi, v.v. Trên thực tế, bản thân tôi cũng không chắc chắn về câu trả lời. Vì vậy, tôi đã làm một số đào. Thuộc tính lớp Python. khi nào [hoặc làm thế nào] sử dụng chúng. Trong hướng dẫn này, tôi sẽ hướng dẫn bạn những cạm bẫy phổ biến và kết luận bằng một danh sách các trường hợp sử dụng hợp lệ có thể giúp bạn tiết kiệm thời gian, năng lượng và dòng mã

Chia sẻ

Chia sẻ

Trong một màn hình điện thoại gần đây, tôi đã quyết định sử dụng một thuộc tính lớp để triển khai một API Python nhất định. Người phỏng vấn của tôi đã thách thức tôi, đặt câu hỏi liệu mã của tôi có hợp lệ về mặt cú pháp hay không, khi nó được thực thi, v.v. Trên thực tế, bản thân tôi cũng không chắc chắn về câu trả lời. Vì vậy, tôi đã làm một số đào. Thuộc tính lớp Python. khi nào [hoặc làm thế nào] sử dụng chúng. Trong hướng dẫn này, tôi sẽ hướng dẫn bạn những cạm bẫy phổ biến và kết luận bằng một danh sách các trường hợp sử dụng hợp lệ có thể giúp bạn tiết kiệm thời gian, năng lượng và dòng mã

Tác giả Charles Marsh

Charles đã từng là trưởng nhóm kỹ thuật tại Khan Academy, Cedar và Spring Discovery

Ghi chú của biên tập viên. Bài viết này đã được cập nhật vào ngày 29/11/22 bởi nhóm biên tập của chúng tôi. Nó đã được sửa đổi để bao gồm các nguồn gần đây và phù hợp với các tiêu chuẩn biên tập hiện tại của chúng tôi

Gần đây tôi đã có một màn hình điện thoại phỏng vấn lập trình, trong đó chúng tôi đã sử dụng một trình soạn thảo văn bản hợp tác và điều đó khiến tôi suy nghĩ về các thuộc tính của lớp Python

Tôi được yêu cầu triển khai một API nhất định và đã chọn thực hiện bằng Python. Trừu tượng hóa câu lệnh vấn đề, giả sử tôi cần một lớp có các thể hiện được lưu trữ một số

{:lang='python'}
    class MyClass[object]:
        class_var = 1

        def __init__[self, i_var]:
            self.i_var = i_var
3 và một số
{:lang='python'}
    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 đó

    {:lang='python'}
        class MyClass[object]:
            class_var = 1
    
            def __init__[self, i_var]:
                self.i_var = i_var
    
    5. Tôi không nghĩ đó là Python hợp lệ. ”

  • Tôi. “Tôi khá chắc là. Nó chỉ đặt giá trị mặc định cho thuộc tính thể hiện. ”

  • người phỏng vấn. “Khi nào đoạn mã đó được thực thi?”

  • Tôi. “Tôi không thực sự chắc chắn. Tôi sẽ chỉ sửa nó để tránh nhầm lẫn. ”

Để tham khảo và cung cấp cho bạn ý tưởng về mục đích của tôi, đây là 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 ta đều sai. Câu trả lời thực sự nằm ở việc hiểu được 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 của Python

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

Thuộc tính lớp Python

Người phỏng vấn của tôi đã sai ở chỗ đoạn mã trên hợp lệ về mặt cú pháp

Tôi đã sai ở chỗ mã không đặt "giá trị mặc định" cho thuộc tính thể hiện. Thay vào đó, nó định nghĩa

{:lang='python'}
    class MyClass[object]:
        class_var = 1

        def __init__[self, i_var]:
            self.i_var = i_var
3 như một thuộc tính lớp có giá trị
{:lang='python'}
    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 người hiểu hoàn toàn

Biến lớp Python so với. Biến thể hiện. Có gì khác biệt?

Thuộc tính lớp Python là thuộc tính của lớp [thông tư, tôi biết], chứ không phải là thuộc tính của một thể hiện của lớp

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

{:lang='python'}
    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à
{:lang='python'}
    class MyClass[object]:
        class_var = 1

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

{:lang='python'}
    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 phiên bản của lớp đều có quyền truy cập vào

{:lang='python'}
    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 như một thuộc tính của chính lớp đó

{:lang='python'}
    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 ## 

Chủ Đề