Cách thay đổi tên thuộc tính trong Python

Chúng tôi muốn làm cho nó sao cho bất cứ khi nào chúng tôi gán cho thuộc tính

>>> trey = Person["Trey", "San Diego"]
>>> trey.name
'Trey'
>>> trey.location
'San Diego'
9, tất cả các giá trị trước đó của thuộc tính
>>> trey = Person["Trey", "San Diego"]
>>> trey.name
'Trey'
>>> trey.location
'San Diego'
9 sẽ được lưu trữ ở đâu đó

>>> trey.location = "Portland"

Chúng tôi muốn tạo một thuộc tính

>>> trey.location = "Portland"
2 sẽ hiển thị cho chúng tôi tất cả các giá trị trước đó cho
>>> trey = Person["Trey", "San Diego"]
>>> trey.name
'Trey'
>>> trey.location
'San Diego'
9 trên một đối tượng cụ thể là
>>> trey = Person["Trey", "San Diego"]
>>> trey.name
'Trey'
>>> trey.location
'San Diego'
6

Các phương thức getter và setter [không được khuyến nghị]

Trong nhiều ngôn ngữ lập trình, như Java, giải pháp cho vấn đề này là các phương thức getter và setter

Vì vậy, thay vì có thuộc tính

>>> trey = Person["Trey", "San Diego"]
>>> trey.name
'Trey'
>>> trey.location
'San Diego'
9, chúng ta sẽ có thuộc tính private. Python không có thuộc tính riêng tư, nhưng đôi khi chúng tôi đặt dấu gạch dưới [
>>> trey.location = "Portland"
6] trước tên thuộc tính để lưu ý rằng thuộc tính đó là riêng tư theo quy ước

Đây là phiên bản cập nhật của lớp

>>> trey = Person["Trey", "San Diego"]
>>> trey.name
'Trey'
>>> trey.location
'San Diego'
6 của chúng tôi với phương thức getter và setter và thuộc tính riêng tư [theo quy ước]
>>> trey.location = "Portland"
8

class Person:
    def __init__[self, name, location]:
        self.name = name
        self.past_locations = []
        self.set_location[location]

    def get_location[self]:
        return self._location

    def set_location[self, location]:
        self._location = location
        self.past_locations.append[location]

Trên lớp mới này, thay vì truy cập trực tiếp vào

>>> trey = Person["Trey", "San Diego"]
>>> trey.name
'Trey'
>>> trey.location
'San Diego'
9 [không còn hoạt động nữa], chúng ta sẽ gọi phương thức
class Person:
    def __init__[self, name, location]:
        self.name = name
        self.past_locations = []
        self.set_location[location]

    def get_location[self]:
        return self._location

    def set_location[self, location]:
        self._location = location
        self.past_locations.append[location]
0

>>> trey = Person["Trey", "San Diego"]
>>> trey.get_location[]
'San Diego'

Và để đặt vị trí, chúng tôi sẽ gọi phương thức

class Person:
    def __init__[self, name, location]:
        self.name = name
        self.past_locations = []
        self.set_location[location]

    def get_location[self]:
        return self._location

    def set_location[self, location]:
        self._location = location
        self.past_locations.append[location]
1

>>> trey.set_location["Portland"]
>>> trey.get_location[]
'Portland'

Lợi ích của các phương thức getter và setter là chúng ta có thể nối vào các phương thức này, đặt bất kỳ mã nào chúng ta muốn bên trong chúng

Ví dụ: trong phương pháp

class Person:
    def __init__[self, name, location]:
        self.name = name
        self.past_locations = []
        self.set_location[location]

    def get_location[self]:
        return self._location

    def set_location[self, location]:
        self._location = location
        self.past_locations.append[location]
1 của chúng tôi, chúng tôi đang thêm vào danh sách
>>> trey.location = "Portland"
2

    def set_location[self, location]:
        self._location = location
        self.past_locations.append[location]

Vì vậy, thuộc tính

>>> trey.location = "Portland"
2 hiện hiển thị tất cả các vị trí chúng tôi đã từng đặt cho đối tượng
>>> trey = Person["Trey", "San Diego"]
>>> trey.name
'Trey'
>>> trey.location
'San Diego'
6 này

>>> trey.past_locations
['San Diego', 'Portland']

Sử dụng các thuộc tính để nối vào việc gán một thuộc tính

Trong Python, chúng ta không có xu hướng sử dụng các phương thức getter và setter. Chúng tôi không có

class Person:
    def __init__[self, name, location]:
        self.name = name
        self.past_locations = []
        self.set_location[location]

    def get_location[self]:
        return self._location

    def set_location[self, location]:
        self._location = location
        self.past_locations.append[location]
6,
class Person:
    def __init__[self, name, location]:
        self.name = name
        self.past_locations = []
        self.set_location[location]

    def get_location[self]:
        return self._location

    def set_location[self, location]:
        self._location = location
        self.past_locations.append[location]
7, và
class Person:
    def __init__[self, name, location]:
        self.name = name
        self.past_locations = []
        self.set_location[location]

    def get_location[self]:
        return self._location

    def set_location[self, location]:
        self._location = location
        self.past_locations.append[location]
0, và
class Person:
    def __init__[self, name, location]:
        self.name = name
        self.past_locations = []
        self.set_location[location]

    def get_location[self]:
        return self._location

    def set_location[self, location]:
        self._location = location
        self.past_locations.append[location]
1 cho mỗi thuộc tính. Thay vào đó, chúng ta có xu hướng chỉ gán các thuộc tính và đọc từ các thuộc tính theo ý muốn

Nhưng trong tình huống cụ thể này [khi chúng tôi có một thuộc tính và chúng tôi muốn thay đổi cách thức hoạt động của nó], chúng tôi gặp khó khăn. Chúng ta cần một số cách để nối vào việc gán thuộc tính đó. May mắn thay, trong Python, có một cách để làm điều này. chúng ta có thể sử dụng một tài sản

Đây là lớp

>>> trey = Person["Trey", "San Diego"]
>>> trey.name
'Trey'
>>> trey.location
'San Diego'
6 đã sửa đổi của chúng tôi với các thuộc tính

class Person:
    def __init__[self, name, location]:
        self.name = name
        self.past_locations = []
        self.location = location

    @property
    def location[self]:
        return self._location

    @location.setter
    def location[self, location]:
        self._location = location
        self.past_locations.append[location]

Các thuộc tính cho phép chúng ta nối vào việc nhận một thuộc tính

>>> trey = Person["Trey", "San Diego"]
>>> trey.location
'San Diego'

Bây giờ, khi chúng tôi truy cập thuộc tính

>>> trey = Person["Trey", "San Diego"]
>>> trey.name
'Trey'
>>> trey.location
'San Diego'
9, thực ra nó đang truy cập thuộc tính
>>> trey.location = "Portland"
8

Nhưng các thuộc tính cũng cho phép chúng tôi tùy chỉnh những gì xảy ra khi chúng tôi gán cho một thuộc tính cụ thể

Theo mặc định, nếu chúng ta gán cho một thuộc tính, chúng ta sẽ gặp lỗi. Nhưng trong trường hợp của chúng tôi, chúng tôi không gặp lỗi

>>> trey = Person["Trey", "San Diego"]
>>> trey.name
'Trey'
>>> trey.location
'San Diego'
0

Nó hoạt động vì chúng tôi đã triển khai một trình thiết lập cho thuộc tính của mình

>>> trey = Person["Trey", "San Diego"]
>>> trey.name
'Trey'
>>> trey.location
'San Diego'
1

Như bạn có thể thấy, cú pháp của property setters hơi lạ. Vì vậy, thay vì ghi nhớ cú pháp, bạn có thể tra cứu khi cần

Cú pháp của trình thiết lập thuộc tính hơi lạ một chút, vì vậy tôi khuyên bạn không nên ghi nhớ nó [chỉ cần tra cứu nó khi/nếu bạn cần]

Phá vỡ cú pháp cho setters thuộc tính

Cú pháp thiết lập thuộc tính bắt đầu bằng tên hoặc thuộc tính của chúng ta [

>>> trey = Person["Trey", "San Diego"]
>>> trey.name
'Trey'
>>> trey.location
'San Diego'
9], theo sau là
>>> trey = Person["Trey", "San Diego"]
>>> trey.get_location[]
'San Diego'
4. Chúng tôi sử dụng nó như một công cụ trang trí để trang trí một phương pháp
>>> trey = Person["Trey", "San Diego"]
>>> trey.name
'Trey'
>>> trey.location
'San Diego'
9 [được đặt tên giống như tài sản của chúng tôi]

>>> trey = Person["Trey", "San Diego"]
>>> trey.name
'Trey'
>>> trey.location
'San Diego'
2

Chúng tôi chấp nhận một đối số đại diện cho bất kỳ nội dung nào được gán cho thuộc tính này [ở phía bên phải của dấu bằng trong quá trình gán]

Sau đó, chúng tôi đang lưu trữ giá trị thực tế đó trên

>>> trey.location = "Portland"
8 và mỗi khi
>>> trey = Person["Trey", "San Diego"]
>>> trey.name
'Trey'
>>> trey.location
'San Diego'
9 thay đổi, chúng tôi sẽ thêm từng giá trị vào danh sách
>>> trey = Person["Trey", "San Diego"]
>>> trey.get_location[]
'San Diego'
8 của mình

>>> trey = Person["Trey", "San Diego"]
>>> trey.name
'Trey'
>>> trey.location
'San Diego'
3

Chúng tôi không bao giờ gán trực tiếp cho thuộc tính riêng tư của mình

Vì vậy, khi chúng tôi truy cập danh sách

>>> trey.location = "Portland"
2, cả hai vị trí của chúng tôi đều được phản ánh

>>> trey.past_locations
['San Diego', 'Portland']

Bất cứ khi nào

>>> trey = Person["Trey", "San Diego"]
>>> trey.name
'Trey'
>>> trey.location
'San Diego'
9 thay đổi,
>>> trey.location = "Portland"
2 sẽ được cập nhật

Lưu ý rằng ngay cả trong trình khởi tạo của chúng tôi, chúng tôi đang chỉ định cho

>>> trey = Person["Trey", "San Diego"]
>>> trey.name
'Trey'
>>> trey.location
'San Diego'
9 [chứ không phải
>>> trey.location = "Portland"
8]

>>> trey = Person["Trey", "San Diego"]
>>> trey.name
'Trey'
>>> trey.location
'San Diego'
5

Đó là lý do "San Diego" là giá trị đầu tiên trong

>>> trey.set_location["Portland"]
>>> trey.get_location[]
'Portland'
4 này. khi chúng tôi gán cho thuộc tính
>>> trey = Person["Trey", "San Diego"]
>>> trey.name
'Trey'
>>> trey.location
'San Diego'
9 trong trình khởi tạo của mình, nó được gọi là trình thiết lập thuộc tính của chúng tôi

Trên thực tế, mỗi khi

>>> trey = Person["Trey", "San Diego"]
>>> trey.name
'Trey'
>>> trey.location
'San Diego'
9 được gán cho, setter sẽ được gọi cho thuộc tính này

Tóm lược

Nếu bạn muốn tùy chỉnh điều gì sẽ xảy ra khi bạn gán cho một thuộc tính cụ thể trên lớp của mình trong Python, bạn có thể sử dụng thuộc tính có trình thiết lập

Chủ Đề