2010-10-06 25 views
7

Tôi đã viết một lớp sẽ được sử dụng để lưu trữ các tham số một cách thuận tiện để tẩy. Nó quá tải __setattr__ để truy cập thuận tiện. Nó cũng sử dụng một danh sách để nhớ thứ tự trong đó các thuộc tính được thêm vào, để thứ tự lặp lại có thể dự đoán được và không đổi. Ở đây là:Làm thế nào để xử lý cuộc gọi đến __setattr__ từ __init__?

class Parameters(object): 
    def __init__(self): 
     self._paramOrder = [] 

    def __setattr__(self, name, value): 
     self._paramOrder.append(name) 
     object.__setattr__(self, name, value) 

    def __delattr__(self, name): 
     self._paramOrder.remove(name) 
     object.__delattr__(self, name) 

    def __iter__(self): 
     for name in self._paramOrder: 
      yield self.name 

    def iteritems(self): 
     for name in self._paramOrder: 
      yield name, self.name 

Vấn đề là __init__ gọi của tôi quá tải __setattr__ để thêm _paramOrder vào từ điển ví dụ. Có cách nào để xử lý việc này mà không thêm trường hợp đặc biệt vào __setattr__?

Trả lời

7

có.

thay vào đó hãy gọi số super(Parameters, self).__setattr__().

class Parameters(object): 
    def __init__(self): 
     super(Parameters, self).__setattr__('paramOrder', []) 

    # etc. 

Hoặc tôi có thiếu gì đó không?

Một lựa chọn khác là chỉ cần đi thẳng đến __dict__

class Parameters(object): 
    def __init__(self): 
     self.__dict__['paramOrder'] = [] 

    # etc. 

này nên làm việc vì bạn không trọng __getattr__ để bạn có thể đọc nó mà không có bất cứ điều gì nhận được trong cách.

+0

tôi làm điều đó ngay bây giờ, nhưng tôi vẫn cần một trường hợp đặc biệt, bởi vì nếu không tên '_paramOrder' sẽ được bổ sung cho' _paramOrder'. –

+0

không phải là mã bạn đã hiển thị. Điều này sẽ bỏ qua phương thức '__setattr__' của' Parameters'. – aaronasterling

+0

Bạn nói đúng. Tôi hiểu lầm, nhưng bây giờ tôi thấy. –

3

Sử dụng dòng này trong __init__ thay vì:

object.__setattr__(self, '_paramOrder', []) 
Các vấn đề liên quan