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'
6Cá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"
8class 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ốnNhư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ínhclass 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"
8Như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'
0Nó 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'
1Như 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'
2Chú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'
3Chú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ậtLư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ôiTrê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àyTó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