2012-10-30 36 views
11

Tôi đang sử dụng python 2.7.3 trên Windows. Tôi đã cố gắng ghi đè phương pháp ma thuật __instancecheck__ như một phương thức lớp học. Nhưng tôi không thể làm cho nó hoạt động được.phương thức lớp __instancecheck__ không hoạt động

class Enumeration(int): 
    @classmethod 
    def __instancecheck__(cls, inst): 
     if type(inst) == cls: 
      return True 
     if isinstance(inst, int) and inst in range(0,10): 
      return True 
     return False 

print isinstance(1, Enumeration) # prints False 
print isinstance(1, Enumeration()) # prints True 

Tôi giả định tuyên bố in đầu tiên sẽ nhận được True. Nhưng có vẻ như phương pháp ma thuật __instancecheck__ không được gọi. Và tôi không biết tại sao câu lệnh in thứ hai có thể hoạt động vì số isinstance nên lấy một lớp/kiểu làm tham số thứ hai.

Có ai biết vấn đề là gì không? Cảm ơn.

Trả lời

18

instancecheck phải được định nghĩa trong một metaclass:

class Enumeration(type): 
    def __instancecheck__(self, other): 
     print 'hi' 
     return True 


class EnumInt(int): 
    __metaclass__ = Enumeration 

print isinstance('foo', EnumInt) # prints True 

Tại sao vậy? Vì lý do tương tự tại sao ví dụ thứ hai của bạn đã làm việc. Khi trăn đánh giá isinstance(A, B) nó giả B là một đối tượng, trông cho các lớp học và các cuộc gọi __instancecheck__ trên lớp rằng:

isinstance(A, B): 
    C = class-of(B) 
    return C.__instancecheck__(A) 

Nhưng khi B là một lớp học riêng của mình, sau đó các lớp học C phải là một lớp của một lớp, nói cách khác, một meta-class!

5

Các tài liệu nói:

Lưu ý rằng các phương pháp này đang nhìn lên trên các loại (metaclass) của một lớp. Chúng không thể được định nghĩa là các phương thức lớp trong lớp thực tế. Điều này phù hợp với việc tra cứu các phương thức đặc biệt được gọi trên các cá thể, chỉ trong trường hợp này cá thể đó là một lớp.

http://docs.python.org/2/reference/datamodel.html#customizing-instance-and-subclass-checks

+0

Cảm ơn bạn. @ thg435 đã cho tôi một ví dụ tốt và bây giờ tôi biết làm thế nào để đạt được điều này. – adarliu

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