2010-03-04 27 views
7

Có một cách hay để sắp xếp thuộc tính lớp trong khung của một hàm, bằng cách sử dụng trình trang trí áp dụng.ngưng sử dụng trang trí

class Example(object): 
    @apply 
    def myattr(): 
     doc = """This is the doc string.""" 

     def fget(self): 
      return self._half * 2 

     def fset(self, value): 
      self._half = value/2 

     def fdel(self): 
      del self._half 

     return property(**locals()) 

Nhưng hiện đã áp dụng đã không được chấp nhận.

Có khả năng nào để đạt được sự đơn giản và dễ đọc như vậy đối với tài sản, với mới, thay vào đó là "cú pháp cuộc gọi mở rộng"?


cách tiếp cận của tôi là giống như Anurag, nhưng, tôi không phải bây giờ phù thuỷ một tốt hơn, xin vui lòng xem xét:

def prop(f): 

    return property(**f()) 

class A(object): 

    @prop 
    def myattr(): 

     def fget(self): 
      return self._myattr 

     def fset(self, value): 
      self._myattr = value 

     return locals() 

Trả lời

12

Có khả năng để đạt được sự đơn giản như vậy và khả năng đọc cho bất động sản

mới Python 2.6 Cách thứ nhất là:

@property 
def myattr(self): 
    """This is the doc string.""" 
    return self._half * 2 

@myattr.setter 
def myattr(self, value): 
    self._half = value/2 

@myattr.deleter 
def myattr(self): 
    del self._half 
+3

Tôi không biết điều này và tôi rất thích nó. Phép thuật 'áp dụng' ở trên quá khó đọc nên tôi không biết câu hỏi đó là gì. Tôi biết @property và sử dụng nó rất nhiều, nhưng .setter và .deleter là mới đối với tôi và nhìn tuyệt vời (tự tài liệu mã) :) –

+0

Bạn đang thiếu tự trong các đối số để getter, không? –

+0

@David: chính xác, cố định, ta. – bobince

0

Bạn luôn có thể viết riêng của bạn:

def apply(f, a): 
    return f(*a) 

Tuy nhiên, tôi không hoàn toàn chắc chắn rằng tôi thấy lợi ích của việc sử dụng apply làm trang trí theo cách này. Trường hợp sử dụng là gì?

+1

tôi muốn đặt các khai báo của các phương thức fget/fset trong phạm vi của một hàm. Có giải pháp nào khác, ngoại trừ trang trí không? –

2

:) đó là một người dùng thông minh áp dụng, mặc dù tôi không chắc chắn nếu có bất kỳ cạm bẫy?

anyway bạn có thể làm điều này

class Example(object): 
    def myattr(): 
     doc = """This is the doc string.""" 

     def fget(self): 
      return self._half * 2 

     def fset(self, value): 
      self._half = value/2 

     def fdel(self): 
      del self._half 

     return property(**locals()) 
    myattr = myattr() 
Các vấn đề liên quan