2012-09-22 15 views
6

Tôi đang cố sử dụng trình trang trí thuộc tính trong một Lớp. Trong khi nó hoạt động tốt cho mỗi se, tôi không thể sử dụng bất kỳ mã nào có quyền truy cập vào REQUEST.Zope: không thể truy cập REQUEST theo trang trí đặc tính

class SomeClass(): 
    #Zope magic code 
    _properties=({'id':'someValue', 'type':'ustring', 'mode':'r'},) 

    def get_someValue(self): 
    return self.REQUEST 

    @property 
    def someValue(self): 
    return self.REQUEST 

Mặc dù gọi get_someValue được cho tôi những kết quả mong muốn, cố gắng truy cập someValue đặt ra một AttributeError.

Logic đằng sau hành vi này là gì? Có cách nào để vượt qua giới hạn này không?

(Tôi đang sử dụng Zope 2.13.16, Python 2.7.3)

+0

Bạn có sử dụng lớp cơ sở như Persistence hoặc Acquisition không? –

+0

Tôi có ObjectManager là một trong các lớp cơ sở (được kế thừa từ Persistent) – Rastaf

+0

cũng như Acquisition.Implicit. :-) –

Trả lời

6

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ì propertybỏ 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.

+1

Cảm ơn bạn rất nhiều! Tôi đang sử dụng Zope trong một vài năm và không bao giờ vấp phải phương thức ComputedAttribute. – Rastaf

+0

Điều này dường như làm việc cho tôi trong một trường hợp (mục nội dung Plone/khéo léo), nhưng với mục đích làm rõ: có bất kỳ tác dụng phụ nào của việc sử dụng trang trí dựa trên ComputedAttribute như thế này trên các lớp kiểu mới không? Lớp cơ sở nào phải có một lớp mở rộng để sử dụng ComputedAttribute (ví dụ, trong một khung nhìn trình duyệt tham gia vào việc mua lại)? – sdupton

+1

Bạn chỉ có thể sử dụng ComputedAttribute trên các lớp bắt nguồn từ 'ExtensionClass' (bao gồm các lớp 'Acquisition.Explicit' và' Acquisition.Implicit'). Khác hơn là không có yêu cầu khác. –

3

Nếu bạn muốn định tuyến xung quanh cần mua lại và không thể đặt rõ ràng yêu cầu gọi mã trong hàm tạo của lớp của bạn, hãy sử dụng zope.globalrequest. Nếu không, bạn có thể muốn xem xét một chế độ xem trình duyệt (mà luôn luôn đa điều chỉnh một số ngữ cảnh và một yêu cầu).

+0

Cảm ơn bạn đã chỉ cho tôi zope.globalrequest. Tôi chưa cài đặt gói, vì vậy tôi sẽ thử nếu tôi cần mua lại. Tại thời điểm này tôi hoàn toàn hài lòng với câu trả lời được cung cấp bởi Martijn Pieters. Ý bạn là gì khi "xem xét chế độ xem trình duyệt"? – Rastaf

Các vấn đề liên quan