2015-05-31 19 views
5
class Custom(type): 
    @classmethod 
    def __getitem__(cls, item): 
     raise NotImplementedError("") 

    @classmethod 
    def test(cls): 
     print("class custom : test") 

class Book(metaclass=Custom): 
    Note = 0 
    Pad = 1 

    Name = { Note : "Note", Pad : "Pad"} 

    @classmethod 
    def __getitem__(cls, item): 
     return Book.Name[item] 

    @classmethod 
    def test(cls): 
     print("class book: test") 

Ý định của tôi là phải cóLàm thế nào để ghi đè lên __getitem__ khi nó là một phương pháp lớp học?

Book[Book.Note] returns "Note" 

Dường __getitem __() không được ghi đè, không giống như thử nghiệm(). Làm thế nào để làm cho nó hoạt động?

Trả lời

4

Bạn đang sử dụng metaclass tại đây. Đây không phải là thừa kế chính xác: bạn đã xác định lớp của lớp BookCustom, trong khi trước đây là type. Bởi vì các phương pháp ma thuật như __getitem__ được tra cứu trực tiếp trên lớp và không phải trên cá thể, việc lập chỉ mục Book[whatever] sẽ thực sự gọi phương thức __getitem__ của lớp Book, xảy ra là Custom.

Ý định của tôi là phải có

Book[Book.Note] 

lợi nhuận "Note"

Trong trường hợp đó, bạn nên làm cho lớp của Book thực hiện __getitem__ như vậy mà nó trả về "Note". Vì lớp học của BookCustom, đây là nơi cần thay đổi:

class Custom(type): 
    def __getitem__(cls, item): 
     return cls.Name[item] 
    ... 

class Book(metaclass=Custom): 
    ... # as is, although you don't need the @classmethod __getitem__ 

Book[Book.Note] # "Note" 
Book[1]   # "Pad" 
+0

@ user1502776 Thật kỳ quặc. Tôi đang sử dụng Python 3 bản thân mình và nó hoạt động. Hãy để tôi xem liệu tôi có thể cùng nhau giới thiệu một bản demo không. –

+0

Cảm ơn bạn. Tất cả đều hoạt động tốt. – user1502776

+0

Giải thích của bạn thể hiện sự hiểu biết sâu sắc về hoạt động của Python. Bạn có thể giới thiệu một cuốn sách để đọc ..? – user1502776

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