Hướng dẫn python access class attribute without instance - Thuộc tính lớp truy cập python không có phiên bản

Tôi đã tự hỏi nếu có thể sử dụng một thuộc tính của một lớp từ một tệp khác mà không tạo một đối tượng từ lớp đó, ví dụ, nếu tôi có class_a trong file_a và tôi nhập class_a vào file_b, tôi có phải sử dụng class_a làm đối tượng trong FILE_B để truy cập các thuộc tính của nó?

hỏi ngày 9 tháng 7 năm 2017 lúc 20:52Jul 9, 2017 at 20:52

2

Cách đơn giản nhất:

In [12]: class MyClass[object]:
...:         attr = 'attr value'

In [15]: MyClass.attr
Out[15]: 'attr value'

Bạn cũng có thể sử dụng thuộc tính __dict__:

__dict__ là từ điển chứa không gian tên của lớp.

In [15]: MyClass.__dict__.get['attr', None]
Out[15]: 'attr value'

Sử dụng Bộ trang trí StaticMethod nếu bạn cần sử dụng phương pháp:

In [12]: class MyClass[object]:
...:         @staticmethod
...:         def the_static_method[x]:
...:             print[x]


In [15]: MyClass.the_static_method[2]
Out[15]: 2

Đã trả lời ngày 9 tháng 7 năm 2017 lúc 21:00Jul 9, 2017 at 21:00

SaypysaypySayPy

5364 Huy hiệu bạc13 Huy hiệu Đồng4 silver badges13 bronze badges

6

Thực sự không có lý do để tạo một đối tượng mới trong khác để sử dụng các thuộc tính và phương thức của một đối tượng khác.

Bạn chỉ muốn tạo một phiên bản của class_a trong file_b để sử dụng các thuộc tính và phương thức của nó.

Ví dụ:

import Class_A

#instance of Class_A
classA = Class_A['params']

#property1 is a property in classA
classA.property1

#doSomething is a method in classA
classA.doSomething[]

Đọc thêm về OOP tại đây //www.python-course.eu/object_oriented_programming.php

Đã trả lời ngày 9 tháng 7 năm 2017 lúc 21:05Jul 9, 2017 at 21:05

Fortuneefressioneefortunee

3,4262 huy hiệu vàng16 Huy hiệu bạc24 Huy hiệu đồng2 gold badges16 silver badges24 bronze badges

2

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ố

In [12]: class MyClass[object]:
...:         @staticmethod
...:         def the_static_method[x]:
...:             print[x]


In [15]: MyClass.the_static_method[2]
Out[15]: 2
7 và một số
In [12]: class MyClass[object]:
...:         @staticmethod
...:         def the_static_method[x]:
...:             print[x]


In [15]: MyClass.the_static_method[2]
Out[15]: 2
8.

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 đó:
    In [12]: class MyClass[object]:
    ...:         @staticmethod
    ...:         def the_static_method[x]:
    ...:             print[x]
    
    
    In [15]: MyClass.the_static_method[2]
    Out[15]: 2
    
    9. 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

In [12]: class MyClass[object]:
...:         @staticmethod
...:         def the_static_method[x]:
...:             print[x]


In [15]: MyClass.the_static_method[2]
Out[15]: 2
7 là thuộc tính lớp có giá trị
import Class_A

#instance of Class_A
classA = Class_A['params']

#property1 is a property in classA
classA.property1

#doSomething is a method in classA
classA.doSomething[]
1.

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,

import Class_A

#instance of Class_A
classA = Class_A['params']

#property1 is a property in classA
classA.property1

#doSomething is a method in classA
classA.doSomething[]
2 là thuộc tính lớp và
import Class_A

#instance of Class_A
classA = Class_A['params']

#property1 is a property in classA
classA.property1

#doSomething is a method in classA
classA.doSomething[]
3 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

import Class_A

#instance of Class_A
classA = Class_A['params']

#property1 is a property in classA
classA.property1

#doSomething is a method in classA
classA.doSomething[]
2 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ủ Đề