2012-11-08 21 views
5

Tôi có một thể hiện của một lớp python.Khỉ vá để nâng cao AttributeError về cố gắng sử dụng một thuộc tính cụ thể của một đối tượng

class Fum(object): 
    foo = Foo() 
    bar = Bar() 

fum = Fum() 

Vì lý do chính đáng mà tôi không muốn xâm nhập, tôi muốn khỉ vá đối tượng này để một trong các thuộc tính của nó không có giới hạn trong một trường hợp sử dụng nhất định. Tôi muốn rằng nếu tôi hoặc một nhà phát triển khác trên đường cố gắng sử dụng thuộc tính trên đối tượng được vá khỉ, một ngoại lệ hữu ích sẽ được giải thích để giải thích tình huống. Tôi đã cố gắng để thực hiện điều này với một tài sản, nhưng tôi không có may mắn.

ví dụ

def raiser(): 
    raise AttributeError("Don't use this attribute on this object. Its disabled for X reason.") 

fum.bar = property(raiser) 

>>> fum.bar 
>>> <property object at 0xb0b8b33f> 

tôi đang thiếu gì?

Trả lời

4

Bạn không thể lồng ghép các thuộc tính trực tiếp lên các phiên bản của đối tượng. descriptors là khái niệm cấp lớp và phải nằm trong phân cấp lớp của một cá thể. Tuy nhiên, có một mẹo hoạt động:

class Fum(object): 
    foo = Foo() 
    bar = Bar() 

fum = Fum() 

class DerivedFum(fum.__class__): 
    bar = property(raiser) 

fum.__class__ = DerivedFum 

fum.bar # --> raise AttributeError 
Các vấn đề liên quan