Tôi có một lớp học như thế này:
class Foo[object]:
def __init__[self]:
self.bar = property[self.get_bar]
def get_bar[self]:
return "bar"
print Foo[].bar #this prints
Tôi đã thấy làm thế nào để các thuộc tính Python hoạt động ?, Làm thế nào để đặt một thuộc tính Python trong __init__, nhưng tất cả chúng đều sử dụng phương pháp trang trí mà tôi không muốn vì tôi muốn có một tên khác. Và tôi cần truy cập vào self
Làm thế nào để tôi có được tài sản để cư xử?
Đã hỏi ngày 16 tháng 2 năm 2014 lúc 13:54Feb 16, 2014 at 13:54
5
Bạn cần thực hiện một thay đổi nhỏ:
class Foo[object]:
def get_bar[self]:
return "bar"
bar = property[get_bar]
print Foo[].bar # prints bar
Tài sản cần phải là một thuộc tính của lớp, không phải là ví dụ; Đó là cách giao thức mô tả hoạt động.
Đã trả lời ngày 16 tháng 2 năm 2014 lúc 14:08Feb 16, 2014 at 14:08
Jonrsharpejonrsharpejonrsharpe
Huy hiệu vàng 110K2525 gold badges217 silver badges402 bronze badges
5
Bạn có thể làm điều đó như thế này
class Foo[object]:
def __init__[self]:
self.__bar = None
def get_bar[self]:
return self.__bar
def set_bar[self, value]:
self.__bar = value
bar = property[get_bar, set_bar]
foo = Foo[]
print foo.bar # None
foo.bar = 1
print foo.bar # 1
Đã trả lời ngày 16 tháng 2 năm 2014 lúc 14:06Feb 16, 2014 at 14:06
Thefourtheyethefourtheyethefourtheye
226K52 Huy hiệu vàng443 Huy hiệu bạc486 Huy hiệu Đồng52 gold badges443 silver badges486 bronze badges
Bạn cũng có thể làm điều đó như được hiển thị ở đây:
class Foo[object]:
def __init__[self]:
self._bar = None
@property
def bar[self]:
return self._bar
@bar.setter
def bar[self, value]:
self._bar = value
@bar.deleter
def bar[self]:
self._bar = None # for instance
tương đương với:
class Also_Foo[object]:
def __init__[self]:
self._bar = None
def get_bar[self]:
return self._bar
def set_bar[self, value]:
self._bar = value
def del_bar[self]:
self._bar = None # for instance
bar = property[fget=get_bar, fset=set_bar, fdel=del_bar, doc=None]
Nhưng không gây ô nhiễm không gian tên lớp với các phương thức get
và set
cho mỗi thuộc tính. without polluting the class namespace with get
and set
methods for each attribute.
Bạn giữ lại quyền truy cập trực tiếp bên ngoài vào biến bằng cách sử dụng
class Foo[object]:
def get_bar[self]:
return "bar"
bar = property[get_bar]
print Foo[].bar # prints bar
0 thay vì class Foo[object]:
def get_bar[self]:
return "bar"
bar = property[get_bar]
print Foo[].bar # prints bar
1.
Đã trả lời ngày 1 tháng 3 năm 2017 lúc 14:46Mar 1, 2017 at 14:46
berna1111berna1111berna1111
1.7591 Huy hiệu vàng19 Huy hiệu bạc20 Huy hiệu Đồng1 gold badge19 silver badges20 bronze badges
Đối tượng không được khởi tạo.
class Foo[object]:
def get_bar[self]:
return "bar"
bar = Foo[]
print[bar.get_bar]
Công viên David
29.2K44 Huy hiệu vàng172 Huy hiệu bạc 310 Huy hiệu đồng44 gold badges172 silver badges310 bronze badges
Đã trả lời ngày 21 tháng 11 năm 2017 lúc 22:10Nov 21, 2017 at 22:10
Warchitectwarchitectwarchitect
3471 Huy hiệu vàng2 Huy hiệu bạc15 Huy hiệu đồng1 gold badge2 silver badges15 bronze badges
2
Trường hợp sử dụng của tôi yêu cầu xác định
class Foo[object]:
def get_bar[self]:
return "bar"
bar = property[get_bar]
print Foo[].bar # prints bar
2 là một tài sản chỉ trong một số điều kiện nhất định, vì vậy tôi đã nhận lời khuyên của Jonrsharpe và chuyển định nghĩa vào class Foo[object]:
def get_bar[self]:
return "bar"
bar = property[get_bar]
print Foo[].bar # prints bar
3 thay vào đó: thay vào đó:class Foo[object]:
def __new__[cls]:
cls.bar = property[cls.get_bar]
return super[Foo, cls].__new__[cls]
def get_bar[self]:
return "bar"
print[Foo[].bar] #this prints "bar"
Tuy nhiên, không có gì đạt được bởi "sự thông minh" này. Khi điều kiện được đáp ứng, lớp chứa tài sản. Tôi cũng có thể đã định nghĩa nó như Jonrsharpe đã làm.
Đã trả lời ngày 21 tháng 2 năm 2021 lúc 19:08Feb 21, 2021 at 19:08
jcomeau_ictxjcomeau_ictxjcomeau_ictx
37K6 Huy hiệu vàng92 Huy hiệu bạc102 Huy hiệu Đồng6 gold badges92 silver badges102 bronze badges