Các property
decorator chỉ làm việc với kiểu mới lớp; có nghĩa là, các lớp kế thừa từ object
. Mua lại (cho phép bạn truy cập vào đối tượng toàn cầu REQUEST
thông qua truy cập thuộc tính), mặt khác là rất nhiều 'old-skool' python và cả hai không hoạt động tốt với nhau, vì property
bỏ qua trình bao bọc chuyển đổi cần thiết để có được đối tượng REQUEST
.
Zope có riêng của nó property
-like phương pháp mà xảy ra trước lớp kiểu mới và property
decorater, gọi ComputedAttribute
, mà thực ra trước khi trang trí và phong cách mới lớp property
bởi trong nhiều năm. Một hàm ComputedAttribute
-wrapped không biết cách xử lý với một đối tượng được cắt bớt Acquisition
.
Bạn có thể sử dụng ComputedAttibute
giống như property
trang trí:
from ComputedAttribute import ComputedAttribute
class SomeClass():
@ComputedAttribute
def someProperty(self):
return 'somevalue'
Chức năng ComputedAttribute
wrapper cũng có thể được cấu hình với một mức độ gói, đó là những gì chúng ta cần khi giao dịch với wrappers Acquisition. Bạn không thể sử dụng ComputedAttribute
như một trang trí trong trường hợp đó:
class SomeClass():
def someValue(self):
return self.REQUEST
someValue = ComputedAttribute(someValue, 1)
Nó là đủ dễ dàng để xác định một chức năng mới để làm trang trí cho chúng ta mặc dù:
from ComputedAttribute import ComputedAttribute
def computed_attribute_decorator(level=0):
def computed_attribute_wrapper(func):
return ComputedAttribute(func, level)
return computed_attribute_wrapper
Stick này trong một module tiện ích ở đâu đó , sau đó bạn có thể sử dụng nó như một trang trí callable để đánh dấu một cái gì đó như một tài sản Acquisition-aware:
class SomeClass():
@computed_attribute_decorator(level=1)
def someValue(self):
return self.REQUEST
Lưu ý rằng không giống như property
, ComputedAttribute
chỉ có thể được sử dụng cho getters; không có hỗ trợ cho người định cư hoặc deleters.
Bạn có sử dụng lớp cơ sở như Persistence hoặc Acquisition không? –
Tôi có ObjectManager là một trong các lớp cơ sở (được kế thừa từ Persistent) – Rastaf
cũng như Acquisition.Implicit. :-) –