2012-03-22 30 views

Trả lời

13

Phương thức ma thuật __getattr__ được gọi khi thuộc tính không tồn tại trên lớp cá thể/lớp/cha mẹ. Bạn muốn sử dụng nó để nâng cao một ngoại lệ đặc biệt cho một thuộc tính thiếu:

class Foo(object): 
    def __getattr__(self, attr): 
     #only called what self.attr doesn't exist 
     raise MyCustonException(attr) 

Nếu bạn muốn tùy chỉnh quyền truy cập vào các thuộc tính lớp, bạn cần phải xác định __getattr__ trên metaclass/loại:

class BooType(type): 
    def __getattr__(self, attr): 
     print attr 
     return attr 

class Boo(object): 
    __metaclass__ = BooType 

boo = Boo() 
Boo.asd # prints asd 
boo.asd # raises an AttributeError like normal 

Nếu bạn muốn tùy chỉnh tất cả truy cập thuộc tính thuộc tính, hãy sử dụng phương pháp ma thuật __getattribute__.

+0

Điều đó có thay đổi quyền truy cập thuộc tính không thuộc tính lớp không? –

+0

@ RomanA.Taycher Tôi đã mở rộng câu trả lời của mình. – agf

2

agf's answer là chính xác và trên thực tế, câu trả lời tôi sắp đưa ra dựa trên đó và nợ một số tín dụng.

Chỉ cần cung cấp thêm thông tin chi tiết về phía thuộc tính lớp, là phần thực sự được đề cập ở đây (trái ngược với sự khác biệt giữa __getattr____getattribute__), tôi muốn thêm tham chiếu đến an answer I wrote to a different similar question chi tiết hơn về sự khác biệt giữa các thuộc tính lớp và cá thể, cách thực hiện điều này và tại sao bạn cần sử dụng một metaclass để ảnh hưởng đến việc tra cứu thuộc tính lớp.

+2

Hey, câu trả lời của bạn cho câu hỏi khác là tốt đẹp, nhưng điều này không thực sự là một câu trả lời cho câu hỏi này. Bạn nên thêm một số nội dung ở đây hoặc đăng bài này dưới dạng nhận xét về câu hỏi hoặc câu trả lời của tôi. – agf

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