2011-08-25 59 views
17

Tôi đã đọc tài liệu python về các lớp cơ sở trừu tượng:python @abstractmethod trang trí

Từ here:

abc.abstractmethod(function) Một trang trí cho thấy phương pháp trừu tượng.

Sử dụng trang trí này yêu cầu metaclass của lớp là ABCMeta hoặc có nguồn gốc từ nó. Một lớp có một metaclass bắt nguồn từ ABCMeta không thể được khởi tạo trừ khi tất cả các phương thức trừu tượng của nó và các thuộc tính bị ghi đè.

here

Bạn có thể áp dụng các @abstractmethod trang trí với các phương pháp như bốc thăm() đó phải được thực hiện; Sau đó, Python sẽ tăng ngoại lệ cho các lớp không xác định phương thức. Lưu ý rằng ngoại lệ chỉ là được tăng lên khi bạn thực sự cố tạo một cá thể của lớp con thiếu phương thức.

Tôi đã sử dụng mã này để kiểm tra mà ra:

import abc 

class AbstractClass(object): 
    __metaclass__ = abc.ABCMeta 

    @abc.abstractmethod 
    def abstractMethod(self): 
    return 

class ConcreteClass(AbstractClass): 
    def __init__(self): 
    self.me = "me" 

c = ConcreteClass() 
c.abstractMethod() 

Mã này đi tốt, vì vậy tôi không nhận được nó. Nếu tôi nhập c.abstractMethod Tôi nhận được:

<bound method ConcreteClass.abstractMethod of <__main__.ConcreteClass object at 0x7f694da1c3d0>> 

Tôi đang thiếu gì ở đây? ConcreteClassphải triển khai các phương pháp trừu tượng, nhưng tôi không có ngoại lệ.

+2

Python nào? Nó báo cáo lỗi chỉ tốt cho tôi. Ngoài ra, bạn luôn có thể nâng NotImplementedError thay vì sử dụng 'abc'. –

+0

Tôi đăng nhận xét về câu trả lời mouad, liên kết từ 'python' được đặt làm mặc định thành' python3'. Tôi sẽ giữ trong tâm trí nâng cao ngoại lệ, như writting mã di động với những thay đổi trên python có vẻ xa từ kiến ​​thức python của tôi. – Sebastian

Trả lời

25

Bạn đang sử dụng python3 để chạy mã đó? nếu có, bạn nên biết rằng khai báo metaclass trong python 3 have changes bạn nên làm như sau:

import abc 

class AbstractClass(metaclass=abc.ABCMeta): 

    @abc.abstractmethod 
    def abstractMethod(self): 
     return 
+0

Cảm ơn, có vẻ như một sự thay đổi lớn giữa các phiên bản (distro của tôi đã trỏ 'python' thành mặc định là' python3'). Làm thế nào để viết cho tương thích ngược? Tôi đoán đây có thể là một câu hỏi khác ... – Sebastian

+1

@Sebastian: 'python3' được thiết kế với khả năng tương thích ngược ít hơn với tiền tố python2 (http://www.python.org/dev/peps/pep-3000/#compatibility-and -transition) nhưng để giải quyết sự không tương thích ngược giữa hai phiên bản, bạn nên sử dụng script 2to3.py (http://docs.python.org/library/2to3.html). – mouad

+0

đẹp, tôi đã thử nghiệm nó. Tôi có thể tiếp tục sử dụng cú pháp '__metaclass__' và sử dụng tập lệnh đó để chuyển đổi thành cú pháp' python3'. Nó chỉ làm những gì bạn đã nêu trong ví dụ. Cảm ơn. – Sebastian

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