class MyClass[object]:
def __init__[self, name]:
self.name = name
self._prof = None
self._ischanged = False
@property
def prof[self]:
if not self._prof:
self._prof = "Sample Prof"
return self._prof
@prof.setter
def prof[self, value, anothervalue]:
pass
Ở đây bạn có thể nhận được giáo sư bằng cách sử dụng:
myclass = MyClass["sam"]
myclass.prof
Nhưng tôi không thể tìm cách đặt các giá trị của Giáo sư.
Trong mã trên, làm thế nào tôi sẽ chuyển hai giá trị cho prof?
James Hopkin
Huy hiệu vàng 13,6K11 gold badge41 silver badges70 bronze badges
Đã hỏi ngày 7 tháng 7 năm 2016 lúc 20:00Jul 7, 2016 at 20:00
paris_serviolaparis_serviolaparis_serviola
3211 Huy hiệu vàng6 Huy hiệu bạc19 Huy hiệu đồng1 gold badge6 silver badges19 bronze badges
Bạn không thể chuyển hai giá trị cho một setter. Khi bạn làm:
instance.property = whatever
Python gọi người thiết lập với
instance.property = whatever
6 [như instance.property = whatever
7] và instance.property = whatever
8 là đối số.Bạn có thể vượt qua 2-Tuple mặc dù:
myclass.prof = ['one', 'two']
Trong trường hợp này, setter sẽ được thông qua 2-tuple
instance.property = whatever
9 làm giá trị. Nếu đó không phải là những gì bạn muốn, bạn nên sử dụng phương thức vani để đặt các giá trị. ví dụ.:myclass.set_prof[value1, value2]
Đã trả lời ngày 7 tháng 7 năm 2016 lúc 20:02Jul 7, 2016 at 20:02
4
- Tài liệu »
- setter
- Chỉnh sửa trên GitHub
Sự mô tả¶
Ghi đè cơ chế truy cập thuộc tính.
Cú pháp
property.getter[method]
Phương pháp phương pháp để trang trí.Nhận xét bài
Một đối tượng thuộc tính có các phương thức Getter, Setter và Deleter có thể sử dụng làm người trang trí tạo ra một bản sao của tài sản với hàm excessor tương ứng được đặt thành hàm được trang trí. Điều này được giải thích tốt nhất với một ví dụ:
class C[object]: def __init__[self]: self._x = None @property def x[self]: """I'm the 'x' property.""" return self._x @x.setter def x[self, value]: self._x = value @x.deleter def x[self]: del self._x
Mã này hoàn toàn tương đương với ví dụ đầu tiên. Hãy chắc chắn đặt cho các chức năng bổ sung cùng tên với thuộc tính gốc [x trong trường hợp này.]
Thuộc tính được trả về cũng có các thuộc tính FGET, FSET và FDEL tương ứng với các đối số của hàm tạo.
Thí dụ¶
>>> foo 3.6055512754639896
Lập trình Python cung cấp cho chúng tôi một trình trang trí
myclass.prof = ['one', 'two']
0 tích hợp, giúp việc sử dụng getter và setters dễ dàng hơn nhiều trong lập trình hướng đối tượng.Trước khi đi sâu vào chi tiết về trang trí
myclass.prof = ['one', 'two']
0 là gì, trước tiên chúng ta hãy xây dựng trực giác về lý do tại sao nó sẽ cần thiết ngay từ đầu.Lớp không có getters và setters
Chúng ta hãy giả sử rằng chúng ta quyết định tạo ra một lớp lưu trữ nhiệt độ theo độ C. Nó cũng sẽ thực hiện một phương pháp để chuyển đổi nhiệt độ thành độ Fahrenheit. Một cách để làm điều này là như sau:
class Celsius:
def __init__[self, temperature = 0]:
self.temperature = temperature
def to_fahrenheit[self]:
return [self.temperature * 1.8] + 32
Chúng ta có thể tạo các đối tượng ra khỏi lớp này và thao tác thuộc tính
myclass.prof = ['one', 'two']
2 như chúng ta muốn:# Basic method of setting and getting attributes in Python
class Celsius:
def __init__[self, temperature=0]:
self.temperature = temperature
def to_fahrenheit[self]:
return [self.temperature * 1.8] + 32
# Create a new object
human = Celsius[]
# Set the temperature
human.temperature = 37
# Get the temperature attribute
print[human.temperature]
# Get the to_fahrenheit method
print[human.to_fahrenheit[]]
Đầu ra
37 98.60000000000001
Các vị trí thập phân bổ sung khi chuyển đổi thành Fahrenheit là do lỗi số học điểm nổi. Để tìm hiểu thêm, hãy truy cập lỗi số học của Python Point.
Bất cứ khi nào chúng tôi gán hoặc truy xuất bất kỳ thuộc tính đối tượng nào như
myclass.prof = ['one', 'two']
2 Như được hiển thị ở trên, Python tìm kiếm nó trong thuộc tính từ điển myclass.prof = ['one', 'two']
4 tích hợp của đối tượng.myclass = MyClass["sam"]
myclass.prof
0Do đó,
myclass.prof = ['one', 'two']
5 trong nội bộ trở thành myclass.prof = ['one', 'two']
6.Sử dụng getters và setters
Giả sử chúng ta muốn mở rộng khả năng sử dụng của lớp C, được xác định ở trên. Chúng tôi biết rằng nhiệt độ của bất kỳ vật thể nào cũng không thể đạt dưới -273,15 độ C.
Hãy cập nhật mã của chúng tôi để thực hiện ràng buộc giá trị này.
Một giải pháp rõ ràng cho các hạn chế trên sẽ là ẩn thuộc tính
myclass.prof = ['one', 'two']
2 [làm cho nó riêng tư] và xác định các phương thức Getter và Setter mới để thao tác nó. Điều này có thể được thực hiện như sau:myclass = MyClass["sam"]
myclass.prof
1Như chúng ta có thể thấy, phương pháp trên giới thiệu hai phương thức
myclass.prof = ['one', 'two']
8 và myclass.prof = ['one', 'two']
9 mới.Hơn nữa,
myclass.prof = ['one', 'two']
2 đã được thay thế bằng myclass.set_prof[value1, value2]
1. Một dấu gạch dưới myclass.set_prof[value1, value2]
2 lúc đầu được sử dụng để biểu thị các biến riêng trong Python.Bây giờ, hãy sử dụng triển khai này:
myclass = MyClass["sam"]
myclass.prof
2Đầu ra
myclass = MyClass["sam"]
myclass.prof
3Các vị trí thập phân bổ sung khi chuyển đổi thành Fahrenheit là do lỗi số học điểm nổi. Để tìm hiểu thêm, hãy truy cập lỗi số học của Python Point.
Bất cứ khi nào chúng tôi gán hoặc truy xuất bất kỳ thuộc tính đối tượng nào như
2 Như được hiển thị ở trên, Python tìm kiếm nó trong thuộc tính từ điển myclass.prof = ['one', 'two']
4 tích hợp của đối tượng.: The private variables don't actually exist in
Python. There are simply norms to be followed. The language itself doesn't apply any restrictions.myclass.prof = ['one', 'two']
myclass = MyClass["sam"]
myclass.prof
4Do đó,
myclass.prof = ['one', 'two']
5 trong nội bộ trở thành myclass.prof = ['one', 'two']
6.Sử dụng getters và setters
Giả sử chúng ta muốn mở rộng khả năng sử dụng của lớp C, được xác định ở trên. Chúng tôi biết rằng nhiệt độ của bất kỳ vật thể nào cũng không thể đạt dưới -273,15 độ C.
Hãy cập nhật mã của chúng tôi để thực hiện ràng buộc giá trị này.
Một giải pháp rõ ràng cho các hạn chế trên sẽ là ẩn thuộc tính
myclass.prof = ['one', 'two']
2 [làm cho nó riêng tư] và xác định các phương thức Getter và Setter mới để thao tác nó. Điều này có thể được thực hiện như sau:myclass = MyClass["sam"]
myclass.prof
5Như chúng ta có thể thấy, phương pháp trên giới thiệu hai phương thức
myclass.prof = ['one', 'two']
8 và myclass.prof = ['one', 'two']
9 mới.Hơn nữa,
myclass.prof = ['one', 'two']
2 đã được thay thế bằng myclass.set_prof[value1, value2]
1. Một dấu gạch dưới myclass.set_prof[value1, value2]
2 lúc đầu được sử dụng để biểu thị các biến riêng trong Python.
Bây giờ, hãy sử dụng triển khai này:
myclass = MyClass["sam"]
myclass.prof
6Đầu ra
myclass = MyClass["sam"]
myclass.prof
7Các vị trí thập phân bổ sung khi chuyển đổi thành Fahrenheit là do lỗi số học điểm nổi. Để tìm hiểu thêm, hãy truy cập lỗi số học của Python Point.
Bất cứ khi nào chúng tôi gán hoặc truy xuất bất kỳ thuộc tính đối tượng nào như
myclass.prof = ['one', 'two']
2 Như được hiển thị ở trên, Python tìm kiếm nó trong thuộc tính từ điển myclass.prof = ['one', 'two']
4 tích hợp của đối tượng.myclass = MyClass["sam"]
myclass.prof
8Do đó,
5 trong nội bộ trở thành myclass.prof = ['one', 'two']
6.myclass.prof = ['one', 'two']
Sử dụng getters và setters
Giả sử chúng ta muốn mở rộng khả năng sử dụng của lớp C, được xác định ở trên. Chúng tôi biết rằng nhiệt độ của bất kỳ vật thể nào cũng không thể đạt dưới -273,15 độ C.
myclass = MyClass["sam"]
myclass.prof
9Hãy cập nhật mã của chúng tôi để thực hiện ràng buộc giá trị này.
Một giải pháp rõ ràng cho các hạn chế trên sẽ là ẩn thuộc tính
2 [làm cho nó riêng tư] và xác định các phương thức Getter và Setter mới để thao tác nó. Điều này có thể được thực hiện như sau:: The actual temperature value is stored in
the private myclass.prof = ['one', 'two']
myclass.set_prof[value1, value2]
1 variable. The myclass.prof = ['one', 'two']
2 attribute is a property object which provides an interface to this private variable.Như chúng ta có thể thấy, phương pháp trên giới thiệu hai phương thức myclass.prof = ['one', 'two']
8 và myclass.prof = ['one', 'two']
9 mới.
myclass.prof = ['one', 'two']
myclass.prof = ['one', 'two']
Hơn nữa,
myclass.prof = ['one', 'two']
2 đã được thay thế bằng myclass.set_prof[value1, value2]
1. Một dấu gạch dưới myclass.set_prof[value1, value2]
2 lúc đầu được sử dụng để biểu thị các biến riêng trong Python.instance.property = whatever
0where,
- Bây giờ, hãy sử dụng triển khai này:
2 là chức năng để đặt giá trị của thuộc tínhclass Celsius: def __init__[self, temperature = 0]: self.temperature = temperature def to_fahrenheit[self]: return [self.temperature * 1.8] + 32
3 là chức năng xóa thuộc tínhclass Celsius: def __init__[self, temperature = 0]: self.temperature = temperature def to_fahrenheit[self]: return [self.temperature * 1.8] + 32
4 là một chuỗi [như một bình luận]class Celsius: def __init__[self, temperature = 0]: self.temperature = temperature def to_fahrenheit[self]: return [self.temperature * 1.8] + 32
Như được thấy từ việc thực hiện, các đối số chức năng này là tùy chọn. Vì vậy, một đối tượng thuộc tính có thể chỉ đơn giản là được tạo như sau.
instance.property = whatever
1Một đối tượng thuộc tính có ba phương thức,
class Celsius:
def __init__[self, temperature = 0]:
self.temperature = temperature
def to_fahrenheit[self]:
return [self.temperature * 1.8] + 32
5, class Celsius:
def __init__[self, temperature = 0]:
self.temperature = temperature
def to_fahrenheit[self]:
return [self.temperature * 1.8] + 32
6 và class Celsius:
def __init__[self, temperature = 0]:
self.temperature = temperature
def to_fahrenheit[self]:
return [self.temperature * 1.8] + 32
7 để chỉ định class Celsius:
def __init__[self, temperature = 0]:
self.temperature = temperature
def to_fahrenheit[self]:
return [self.temperature * 1.8] + 32
1, class Celsius:
def __init__[self, temperature = 0]:
self.temperature = temperature
def to_fahrenheit[self]:
return [self.temperature * 1.8] + 32
2 và class Celsius:
def __init__[self, temperature = 0]:
self.temperature = temperature
def to_fahrenheit[self]:
return [self.temperature * 1.8] + 32
3 ở điểm sau. Điều này có nghĩa là, dòng:instance.property = whatever
2có thể bị phá vỡ như:
instance.property = whatever
3Hai đoạn mã này là tương đương.
Các lập trình viên quen thuộc với các nhà trang trí Python có thể nhận ra rằng cấu trúc trên có thể được thực hiện như là nhà trang trí.
Chúng tôi thậm chí không thể xác định tên
class C[object]: def __init__[self]: self._x = None @property def x[self]: """I'm the 'x' property.""" return self._x @x.setter def x[self, value]: self._x = value @x.deleter def x[self]: del self._x3 và
class C[object]: def __init__[self]: self._x = None @property def x[self]: """I'm the 'x' property.""" return self._x @x.setter def x[self, value]: self._x = value @x.deleter def x[self]: del self._x4 vì chúng không cần thiết và gây ô nhiễm không gian tên lớp.
Đối với điều này, chúng tôi sử dụng lại tên
myclass.prof = ['one', 'two']
2 trong khi xác định các hàm getter và setter của chúng tôi. Hãy xem cách thực hiện điều này như một người trang trí:instance.property = whatever
4Đầu ra
instance.property = whatever
5Việc thực hiện trên là đơn giản và hiệu quả. Đó là cách khuyến nghị để sử dụng
myclass.set_prof[value1, value2]
8.