Hướng dẫn how do i change a class attribute in python? - làm cách nào để thay đổi thuộc tính lớp trong python?

Vấn đề là bạn đang cố gắng xác định lại giá trị của một thể hiện từ bên ngoài lớp. Vì trong

car1 = Car[]
car2 = Car[]
change_attribute[car1.color, "red"]
print[car1.color]  # Prints red
print[car2.color]  # Prints red

change_attribute[car2.color, "blue"]
print[car1.color]  # Prints blue
print[car2.color]  # Prints blue
6, bạn đang xác định các biến của mình với
car1 = Car[]
car2 = Car[]
change_attribute[car1.color, "red"]
print[car1.color]  # Prints red
print[car2.color]  # Prints red

change_attribute[car2.color, "blue"]
print[car1.color]  # Prints blue
print[car2.color]  # Prints blue
7, chúng chỉ có sẵn cho trường hợp đó. Đây là điểm của một lớp học - đó là những gì làm cho chúng có thể mở rộng và có thể tái sử dụng.

Lý tưởng nhất, bạn sẽ tạo một phương thức trong lớp sẽ cập nhật các thuộc tính đó, tuy nhiên, nếu bạn thực sự cần cập nhật lớp từ một hàm bên ngoài, bạn sẽ phải xác định nó là biến cấp lớp. Ví dụ:

class Car:

    def __init__[self]:
        Car.color = "green"

Bây giờ có thể được cập nhật bằng cách sử dụng:

def change_attribute[attribute, value]:
    "In this function I can not access car.color directly"
    Car.color=value

Bên ngoài lớp vì bạn đã không gán nó cho một trường hợp cụ thể. Làm điều này là một vấn đề, tuy nhiên. Vì chúng tôi không có biến thể hiện riêng, nếu chúng tôi cố gắng tái tạo lớp, chúng tôi bị mắc kẹt với những gì đã thay đổi trước đó, tức là nếu name == "chính":name == "main":

car1 = Car[]
car2 = Car[]
change_attribute[car1.color, "red"]
print[car1.color]  # Prints red
print[car2.color]  # Prints red

change_attribute[car2.color, "blue"]
print[car1.color]  # Prints blue
print[car2.color]  # Prints blue

Đây là lý do tại sao bản thân các lớp nên được khép kín và có nghĩa là bất biến - trường hợp nên được thay đổi.

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ố

car1 = Car[]
car2 = Car[]
change_attribute[car1.color, "red"]
print[car1.color]  # Prints red
print[car2.color]  # Prints red

change_attribute[car2.color, "blue"]
print[car1.color]  # Prints blue
print[car2.color]  # Prints blue
8 và một số
car1 = Car[]
car2 = Car[]
change_attribute[car1.color, "red"]
print[car1.color]  # Prints red
print[car2.color]  # Prints red

change_attribute[car2.color, "blue"]
print[car1.color]  # Prints blue
print[car2.color]  # Prints blue
9.

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 Service[object]:
        data = []
    
        def __init__[self, other_data]:
            self.other_data = other_data
        ...
    
    0. 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

car1 = Car[]
car2 = Car[]
change_attribute[car1.color, "red"]
print[car1.color]  # Prints red
print[car2.color]  # Prints red

change_attribute[car2.color, "blue"]
print[car1.color]  # Prints blue
print[car2.color]  # Prints blue
8 là thuộc tính lớp có giá trị
class Service[object]:
    data = []

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

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 Service[object]:
    data = []

    def __init__[self, other_data]:
        self.other_data = other_data
    ...
3 là thuộc tính lớp và
class Service[object]:
    data = []

    def __init__[self, other_data]:
        self.other_data = other_data
    ...
4 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 Service[object]:
    data = []

    def __init__[self, other_data]:
        self.other_data = other_data
    ...
3 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 ## 

Chủ Đề