Hướng dẫn what is type ( abc ) in python? - type (abc) trong python là gì?


Một lớp được gọi là một lớp trừu tượng nếu nó chứa một hoặc nhiều phương thức trừu tượng. Một phương pháp trừu tượng là một phương pháp được khai báo, nhưng không chứa việc thực hiện. Các lớp trừu tượng có thể không được khởi tạo và các phương pháp trừu tượng của nó phải được thực hiện bởi các lớp con của nó.

Các lớp cơ sở trừu tượng cung cấp một cách để xác định các giao diện khi các kỹ thuật khác như hasattr () sẽ là vụng về hoặc sai một cách tinh tế (ví dụ với các phương thức ma thuật). ABC giới thiệu các lớp con ảo, là các lớp không di truyền từ một lớp nhưng vẫn được công nhận bởi các hàm isinstance () và issubclass (). Có rất nhiều ABC tích hợp trong Python. ABCS cho các cấu trúc dữ liệu như trình lặp, trình tạo, bộ, ánh xạ, vv được xác định trong bộ sưu tập.ABC Module. Mô -đun số xác định tháp số là tập hợp các lớp cơ sở cho các loại dữ liệu số. Mô -đun 'ABC' trong Thư viện Python cung cấp cơ sở hạ tầng để xác định các lớp cơ sở trừu tượng tùy chỉnh.

'ABC' hoạt động bằng cách đánh dấu các phương pháp của lớp cơ sở là trừu tượng. Điều này được thực hiện bởi @absttractmethod. Một lớp cụ thể là một lớp phụ của lớp cơ sở trừu tượng như vậy sau đó thực hiện cơ sở trừu tượng bằng cách ghi đè lên các phương thức trừu tượng của nó.

Mô -đun ABC xác định lớp ABCMeta là một metaclass để xác định lớp cơ sở trừu tượng. Ví dụ sau đây định nghĩa lớp hình dạng là một lớp cơ sở trừu tượng sử dụng ABCMeta. Lớp hình có phương thức khu vực () được trang trí bởi Tóm tắtMethod.ABCMeta class which is a metaclass for defining abstract base class. Following example defines Shape class as an abstract base class using ABCMeta. The shape class has area() method decorated by abstractmethod.

Một lớp hình chữ nhật hiện sử dụng lớp hình trên làm cha mẹ của nó và triển khai phương thức Tóm tắt (). Vì nó là một lớp cụ thể, nên nó có thể là phương thức IMLEMENTED () có thể được gọi.

import abc
class Shape(metaclass=abc.ABCMeta):
   @abc.abstractmethod
   def area(self):
      pass
class Rectangle(Shape):
   def __init__(self, x,y):
      self.l = x
      self.b=y
   def area(self):
      return self.l*self.b
r = Rectangle(10,20)
print ('area: ',r.area())

Lưu ý lớp cơ sở trừu tượng có thể có nhiều hơn một phương pháp trừu tượng. Lớp trẻ phải thực hiện tất cả trong số họ thất bại trong kiểu loại nào sẽ được nuôi dưỡng.

Mô -đun ABC cũng xác định lớp trợ giúp ABC có thể được sử dụng thay vì lớp ABCMeta trong định nghĩa của lớp cơ sở trừu tượng.ABC helper class which can be used instead of ABCMeta class in definition of abstract base class.

class Shape(abc.ABC):
   @abc.abstractmethod
   def area(self):
      pass

Thay vì phân lớp từ lớp cơ sở trừu tượng, nó có thể được đăng ký làm cơ sở trừu tượng bởi người trang trí lớp đăng ký.

class Shape(abc.ABC):
   @abc.abstractmethod
   def area(self):
      pass
@Shape.register
class Rectangle():
   def __init__(self, x,y):
   self.l = x
   self.b=y
   def area(self):
      return self.l*self.b

Bạn cũng có thể cung cấp các phương thức lớp và phương thức tĩnh trong lớp cơ sở trừu tượng của các trình trang trí @abstractclassmethod và @abstractstatic Phương pháp trang trí tương ứng.

Hướng dẫn what is type ( abc ) in python? - type (abc) trong python là gì?

Cập nhật vào ngày 30 tháng 3 năm 2019 22:30:24

  • Câu hỏi và câu trả lời liên quan
  • Các lớp cơ sở trừu tượng Python cho các thùng chứa
  • Các lớp cơ sở ngoại lệ Python
  • Các lớp học cơ sở thông dịch trong Python
  • Các lớp học trừu tượng trong Java
  • Các lớp học trừu tượng trong C#
  • Các lớp học trừu tượng trong lập trình phi tiêu
  • Các lớp trừu tượng trong C#là gì?
  • Các lớp trừu tượng trong Java là gì?
  • Phương pháp trừu tượng và các lớp học trong Java
  • Các chức năng ảo thuần túy và các lớp trừu tượng trong C ++
  • Sự khác biệt giữa các đặc điểm và các lớp trừu tượng trong scala.
  • Tóm tắt so với các lớp niêm phong so với thành viên lớp trong C#
  • Các lớp cơ sở và có nguồn gốc trong C#là gì?
  • Bắt cơ sở và các lớp có nguồn gốc ngoại lệ trong C ++
  • Sự khác biệt giữa các giao diện và các lớp trừu tượng trong Java là gì?

Mã nguồn: lib/abc.py Lib/abc.py


Mô -đun này cung cấp cơ sở hạ tầng để xác định các lớp cơ sở trừu tượng (ABC) trong Python, như được nêu trong PEP 3119; Xem PEP cho lý do tại sao điều này đã được thêm vào Python. (Xem thêm PEP 3141 và mô -đun

class Shape(abc.ABC):
   @abc.abstractmethod
   def area(self):
      pass
4 liên quan đến phân cấp loại cho các số dựa trên ABC.)abstract base classes (ABCs) in Python, as outlined in PEP 3119; see the PEP for why this was added to Python. (See also PEP 3141 and the
class Shape(abc.ABC):
   @abc.abstractmethod
   def area(self):
      pass
4 module regarding a type hierarchy for numbers based on ABCs.)

Mô -đun

class Shape(abc.ABC):
   @abc.abstractmethod
   def area(self):
      pass
5 có một số lớp cụ thể xuất phát từ ABC; Những điều này, tất nhiên, có thể bắt nguồn thêm. Ngoài ra, mô hình con
class Shape(abc.ABC):
   @abc.abstractmethod
   def area(self):
      pass
6 có một số ABC có thể được sử dụng để kiểm tra xem một lớp hoặc phiên bản cung cấp một giao diện cụ thể, ví dụ, nếu nó có thể băm hay nếu đó là ánh xạ.

Mô -đun này cung cấp Metaclass

class Shape(abc.ABC):
   @abc.abstractmethod
   def area(self):
      pass
7 để xác định ABC và lớp trợ giúp
class Shape(abc.ABC):
   @abc.abstractmethod
   def area(self):
      pass
8 để xác định thay thế ABC thông qua kế thừa:

Lớp ________ 19 ________ 20¶

Một lớp trợ giúp có

class Shape(abc.ABC):
   @abc.abstractmethod
   def area(self):
      pass
7 là metaclass của nó. Với lớp này, một lớp cơ sở trừu tượng có thể được tạo bằng cách đơn giản xuất phát từ
class Shape(abc.ABC):
   @abc.abstractmethod
   def area(self):
      pass
8 Tránh đôi khi sử dụng Metaclass khó hiểu, ví dụ::

from abc import ABC

class MyABC(ABC):
    pass

Lưu ý rằng loại

class Shape(abc.ABC):
   @abc.abstractmethod
   def area(self):
      pass
8 vẫn là
class Shape(abc.ABC):
   @abc.abstractmethod
   def area(self):
      pass
7, do đó kế thừa từ
class Shape(abc.ABC):
   @abc.abstractmethod
   def area(self):
      pass
8 đòi hỏi các biện pháp phòng ngừa thông thường liên quan đến việc sử dụng Metaclass, vì nhiều kế thừa có thể dẫn đến xung đột metaclass. Người ta cũng có thể xác định một lớp cơ sở trừu tượng bằng cách truyền từ khóa Metaclass và sử dụng trực tiếp
class Shape(abc.ABC):
   @abc.abstractmethod
   def area(self):
      pass
7, ví dụ:

from abc import ABCMeta

class MyABC(metaclass=ABCMeta):
    pass

Mới trong phiên bản 3.4.

________ 19 ________ 106 (CLS) ¶

Một chức năng để tính toán lại một trạng thái trừu tượng của lớp trừu tượng. Hàm này nên được gọi là nếu một phương thức trừu tượng của lớp đã được thực hiện hoặc thay đổi sau khi nó được tạo. Thông thường, chức năng này nên được gọi từ trong một người trang trí lớp.

Trả về CLS, để cho phép sử dụng như một người trang trí lớp.

Các lớp được tạo bằng metaclass của

class Shape(abc.ABC):
   @abc.abstractmethod
   def area(self):
      pass
7 có phương pháp sau:

________ 32 (lớp con)(subclass)

Đăng ký lớp con dưới dạng lớp con ảo ảo của ABC này. Ví dụ:

from abc import ABC

class MyABC(ABC):
    pass

MyABC.register(tuple)

assert issubclass(tuple, MyABC)
assert isinstance((), MyABC)

Đã thay đổi trong phiên bản 3.3: Trả về lớp con đã đăng ký, để cho phép sử dụng làm người trang trí lớp.Returns the registered subclass, to allow usage as a class decorator.

Bạn cũng có thể ghi đè phương thức này trong một lớp cơ sở trừu tượng:

________ 33 (lớp con)(subclass)

(Phải được định nghĩa là phương thức lớp.)

Kiểm tra xem phân lớp con được coi là một lớp con của ABC này. Điều này có nghĩa là bạn có thể tùy chỉnh hành vi của

from abc import ABC

class MyABC(ABC):
    pass
4 nữa mà không cần phải gọi
from abc import ABC

class MyABC(ABC):
    pass
5 trên mỗi lớp bạn muốn xem xét một lớp con của ABC. (Phương pháp lớp này được gọi từ phương thức
from abc import ABC

class MyABC(ABC):
    pass
6 của ABC.)

Phương pháp này sẽ trả về

from abc import ABC

class MyABC(ABC):
    pass
7,
from abc import ABC

class MyABC(ABC):
    pass
8 hoặc
from abc import ABC

class MyABC(ABC):
    pass
9. Nếu nó trả về
from abc import ABC

class MyABC(ABC):
    pass
7, lớp con được coi là một lớp con của ABC này. Nếu nó trả về
from abc import ABC

class MyABC(ABC):
    pass
8, lớp con không được coi là một lớp con của ABC này, ngay cả khi nó thường là một. Nếu nó trả về
from abc import ABC

class MyABC(ABC):
    pass
9, kiểm tra lớp con được tiếp tục với cơ chế thông thường.

Để trình diễn các khái niệm này, hãy xem ví dụ này định nghĩa ABC:

class Foo:
    def __getitem__(self, index):
        ...
    def __len__(self):
        ...
    def get_iterator(self):
        return iter(self)

class MyIterable(ABC):

    @abstractmethod
    def __iter__(self):
        while False:
            yield None

    def get_iterator(self):
        return self.__iter__()

    @classmethod
    def __subclasshook__(cls, C):
        if cls is MyIterable:
            if any("__iter__" in B.__dict__ for B in C.__mro__):
                return True
        return NotImplemented

MyIterable.register(Foo)

ABC

from abc import ABCMeta

class MyABC(metaclass=ABCMeta):
    pass
3 định nghĩa phương pháp ITBER tiêu chuẩn,
from abc import ABCMeta

class MyABC(metaclass=ABCMeta):
    pass
4, là một phương pháp trừu tượng. Việc thực hiện được đưa ra ở đây vẫn có thể được gọi từ các lớp con. Phương pháp
from abc import ABCMeta

class MyABC(metaclass=ABCMeta):
    pass
5 cũng là một phần của lớp cơ sở trừu tượng
from abc import ABCMeta

class MyABC(metaclass=ABCMeta):
    pass
3, nhưng nó không phải được ghi đè trong các lớp có nguồn gốc không phải là Abstract.

Phương thức lớp

from abc import ABCMeta

class MyABC(metaclass=ABCMeta):
    pass
7 được xác định ở đây nói rằng bất kỳ lớp nào có phương thức
from abc import ABCMeta

class MyABC(metaclass=ABCMeta):
    pass
4 trong
from abc import ABCMeta

class MyABC(metaclass=ABCMeta):
    pass
9 của nó (hoặc theo một trong các lớp cơ sở của nó, được truy cập thông qua danh sách
from abc import ABC

class MyABC(ABC):
    pass

MyABC.register(tuple)

assert issubclass(tuple, MyABC)
assert isinstance((), MyABC)
0) cũng được coi là
from abc import ABCMeta

class MyABC(metaclass=ABCMeta):
    pass
3.

Cuối cùng, dòng cuối cùng làm cho

from abc import ABC

class MyABC(ABC):
    pass

MyABC.register(tuple)

assert issubclass(tuple, MyABC)
assert isinstance((), MyABC)
2 một lớp con ảo là
from abc import ABCMeta

class MyABC(metaclass=ABCMeta):
    pass
3, mặc dù nó không xác định phương thức
from abc import ABCMeta

class MyABC(metaclass=ABCMeta):
    pass
4 (nó sử dụng giao thức có thể lặp lại kiểu cũ, được định nghĩa theo định nghĩa của
from abc import ABC

class MyABC(ABC):
    pass

MyABC.register(tuple)

assert issubclass(tuple, MyABC)
assert isinstance((), MyABC)
5 và
from abc import ABC

class MyABC(ABC):
    pass

MyABC.register(tuple)

assert issubclass(tuple, MyABC)
assert isinstance((), MyABC)
6). Lưu ý rằng điều này sẽ không cung cấp
from abc import ABC

class MyABC(ABC):
    pass

MyABC.register(tuple)

assert issubclass(tuple, MyABC)
assert isinstance((), MyABC)
7 có sẵn như một phương pháp của
from abc import ABC

class MyABC(ABC):
    pass

MyABC.register(tuple)

assert issubclass(tuple, MyABC)
assert isinstance((), MyABC)
2, vì vậy nó được cung cấp riêng biệt.

Mô -đun

from abc import ABC

class MyABC(ABC):
    pass

MyABC.register(tuple)

assert issubclass(tuple, MyABC)
assert isinstance((), MyABC)
9 cũng cung cấp bộ trang trí sau:

________ 60 ________ 19 ________ 62¶

Một nhà trang trí chỉ ra các phương pháp trừu tượng.

Sử dụng bộ trang trí này yêu cầu lớp Metaclass của lớp là

class Shape(abc.ABC):
   @abc.abstractmethod
   def area(self):
      pass
7 hoặc có nguồn gốc từ nó. Một lớp có metaclass có nguồn gốc từ
class Shape(abc.ABC):
   @abc.abstractmethod
   def area(self):
      pass
7 không thể được khởi tạo trừ khi tất cả các phương thức và thuộc tính trừu tượng của nó được ghi đè. Các phương thức trừu tượng có thể được gọi bằng cách sử dụng bất kỳ cơ chế cuộc gọi siêu bình thường nào.
class Foo:
    def __getitem__(self, index):
        ...
    def __len__(self):
        ...
    def get_iterator(self):
        return iter(self)

class MyIterable(ABC):

    @abstractmethod
    def __iter__(self):
        while False:
            yield None

    def get_iterator(self):
        return self.__iter__()

    @classmethod
    def __subclasshook__(cls, C):
        if cls is MyIterable:
            if any("__iter__" in B.__dict__ for B in C.__mro__):
                return True
        return NotImplemented

MyIterable.register(Foo)
5 có thể được sử dụng để khai báo các phương thức trừu tượng cho các thuộc tính và mô tả.

Động lực thêm các phương thức trừu tượng vào một lớp hoặc cố gắng sửa đổi trạng thái trừu tượng của một phương thức hoặc lớp sau khi nó được tạo, chỉ được hỗ trợ bằng hàm

class Foo:
    def __getitem__(self, index):
        ...
    def __len__(self):
        ...
    def get_iterator(self):
        return iter(self)

class MyIterable(ABC):

    @abstractmethod
    def __iter__(self):
        while False:
            yield None

    def get_iterator(self):
        return self.__iter__()

    @classmethod
    def __subclasshook__(cls, C):
        if cls is MyIterable:
            if any("__iter__" in B.__dict__ for B in C.__mro__):
                return True
        return NotImplemented

MyIterable.register(Foo)
6.
class Foo:
    def __getitem__(self, index):
        ...
    def __len__(self):
        ...
    def get_iterator(self):
        return iter(self)

class MyIterable(ABC):

    @abstractmethod
    def __iter__(self):
        while False:
            yield None

    def get_iterator(self):
        return self.__iter__()

    @classmethod
    def __subclasshook__(cls, C):
        if cls is MyIterable:
            if any("__iter__" in B.__dict__ for B in C.__mro__):
                return True
        return NotImplemented

MyIterable.register(Foo)
5 chỉ ảnh hưởng đến các lớp con có nguồn gốc bằng cách sử dụng thừa kế thường xuyên; Các lớp con ảo ảo đã đăng ký với phương pháp ABC ____ ____35 không bị ảnh hưởng.

Khi

class Foo:
    def __getitem__(self, index):
        ...
    def __len__(self):
        ...
    def get_iterator(self):
        return iter(self)

class MyIterable(ABC):

    @abstractmethod
    def __iter__(self):
        while False:
            yield None

    def get_iterator(self):
        return self.__iter__()

    @classmethod
    def __subclasshook__(cls, C):
        if cls is MyIterable:
            if any("__iter__" in B.__dict__ for B in C.__mro__):
                return True
        return NotImplemented

MyIterable.register(Foo)
5 được áp dụng kết hợp với các mô tả phương pháp khác, nó nên được áp dụng làm chất trang trí trong cùng, như thể hiện trong các ví dụ sử dụng sau đây:

class C(ABC):
    @abstractmethod
    def my_abstract_method(self, arg1):
        ...
    @classmethod
    @abstractmethod
    def my_abstract_classmethod(cls, arg2):
        ...
    @staticmethod
    @abstractmethod
    def my_abstract_staticmethod(arg3):
        ...

    @property
    @abstractmethod
    def my_abstract_property(self):
        ...
    @my_abstract_property.setter
    @abstractmethod
    def my_abstract_property(self, val):
        ...

    @abstractmethod
    def _get_x(self):
        ...
    @abstractmethod
    def _set_x(self, val):
        ...
    x = property(_get_x, _set_x)

Để tương tác chính xác với máy móc lớp cơ sở trừu tượng, bộ mô tả phải tự xác định là trừu tượng bằng cách sử dụng

class C(ABC):
    @abstractmethod
    def my_abstract_method(self, arg1):
        ...
    @classmethod
    @abstractmethod
    def my_abstract_classmethod(cls, arg2):
        ...
    @staticmethod
    @abstractmethod
    def my_abstract_staticmethod(arg3):
        ...

    @property
    @abstractmethod
    def my_abstract_property(self):
        ...
    @my_abstract_property.setter
    @abstractmethod
    def my_abstract_property(self, val):
        ...

    @abstractmethod
    def _get_x(self):
        ...
    @abstractmethod
    def _set_x(self, val):
        ...
    x = property(_get_x, _set_x)
0. Nói chung, thuộc tính này phải là
from abc import ABC

class MyABC(ABC):
    pass
7 nếu bất kỳ phương pháp nào được sử dụng để soạn thảo mô tả là trừu tượng. Ví dụ: Python sườn tích hợp
class C(ABC):
    @abstractmethod
    def my_abstract_method(self, arg1):
        ...
    @classmethod
    @abstractmethod
    def my_abstract_classmethod(cls, arg2):
        ...
    @staticmethod
    @abstractmethod
    def my_abstract_staticmethod(arg3):
        ...

    @property
    @abstractmethod
    def my_abstract_property(self):
        ...
    @my_abstract_property.setter
    @abstractmethod
    def my_abstract_property(self, val):
        ...

    @abstractmethod
    def _get_x(self):
        ...
    @abstractmethod
    def _set_x(self, val):
        ...
    x = property(_get_x, _set_x)
2 tương đương với:

class Descriptor:
    ...
    @property
    def __isabstractmethod__(self):
        return any(getattr(f, '__isabstractmethod__', False) for
                   f in (self._fget, self._fset, self._fdel))

Ghi chú

Không giống như các phương thức trừu tượng Java, các phương pháp trừu tượng này có thể có một triển khai. Việc triển khai này có thể được gọi thông qua cơ chế

from abc import ABC

class MyABC(ABC):
    pass
0 từ lớp ghi đè nó. Điều này có thể hữu ích như một điểm cuối cho một cuộc gọi siêu trong một khung sử dụng nhiều nội dung hợp tác.

Mô -đun

from abc import ABC

class MyABC(ABC):
    pass

MyABC.register(tuple)

assert issubclass(tuple, MyABC)
assert isinstance((), MyABC)
9 cũng hỗ trợ các nhà trang trí di sản sau:

________ 60 ________ 19 ________ 77¶

Mới trong phiên bản 3.2.

Không dùng nữa kể từ phiên bản 3.3: Bây giờ có thể sử dụng

class C(ABC):
    @abstractmethod
    def my_abstract_method(self, arg1):
        ...
    @classmethod
    @abstractmethod
    def my_abstract_classmethod(cls, arg2):
        ...
    @staticmethod
    @abstractmethod
    def my_abstract_staticmethod(arg3):
        ...

    @property
    @abstractmethod
    def my_abstract_property(self):
        ...
    @my_abstract_property.setter
    @abstractmethod
    def my_abstract_property(self, val):
        ...

    @abstractmethod
    def _get_x(self):
        ...
    @abstractmethod
    def _set_x(self, val):
        ...
    x = property(_get_x, _set_x)
8 với
class Foo:
    def __getitem__(self, index):
        ...
    def __len__(self):
        ...
    def get_iterator(self):
        return iter(self)

class MyIterable(ABC):

    @abstractmethod
    def __iter__(self):
        while False:
            yield None

    def get_iterator(self):
        return self.__iter__()

    @classmethod
    def __subclasshook__(cls, C):
        if cls is MyIterable:
            if any("__iter__" in B.__dict__ for B in C.__mro__):
                return True
        return NotImplemented

MyIterable.register(Foo)
5, làm cho bộ trang trí này trở nên dư thừa.It is now possible to use
class C(ABC):
    @abstractmethod
    def my_abstract_method(self, arg1):
        ...
    @classmethod
    @abstractmethod
    def my_abstract_classmethod(cls, arg2):
        ...
    @staticmethod
    @abstractmethod
    def my_abstract_staticmethod(arg3):
        ...

    @property
    @abstractmethod
    def my_abstract_property(self):
        ...
    @my_abstract_property.setter
    @abstractmethod
    def my_abstract_property(self, val):
        ...

    @abstractmethod
    def _get_x(self):
        ...
    @abstractmethod
    def _set_x(self, val):
        ...
    x = property(_get_x, _set_x)
8 with
class Foo:
    def __getitem__(self, index):
        ...
    def __len__(self):
        ...
    def get_iterator(self):
        return iter(self)

class MyIterable(ABC):

    @abstractmethod
    def __iter__(self):
        while False:
            yield None

    def get_iterator(self):
        return self.__iter__()

    @classmethod
    def __subclasshook__(cls, C):
        if cls is MyIterable:
            if any("__iter__" in B.__dict__ for B in C.__mro__):
                return True
        return NotImplemented

MyIterable.register(Foo)
5, making this decorator redundant.

Một lớp con của

class Descriptor:
    ...
    @property
    def __isabstractmethod__(self):
        return any(getattr(f, '__isabstractmethod__', False) for
                   f in (self._fget, self._fset, self._fdel))
0 tích hợp, chỉ ra một lớp học trừu tượng. Nếu không, nó tương tự như
class Foo:
    def __getitem__(self, index):
        ...
    def __len__(self):
        ...
    def get_iterator(self):
        return iter(self)

class MyIterable(ABC):

    @abstractmethod
    def __iter__(self):
        while False:
            yield None

    def get_iterator(self):
        return self.__iter__()

    @classmethod
    def __subclasshook__(cls, C):
        if cls is MyIterable:
            if any("__iter__" in B.__dict__ for B in C.__mro__):
                return True
        return NotImplemented

MyIterable.register(Foo)
5.

Trường hợp đặc biệt này không được chấp nhận, vì người trang trí

class Descriptor:
    ...
    @property
    def __isabstractmethod__(self):
        return any(getattr(f, '__isabstractmethod__', False) for
                   f in (self._fget, self._fset, self._fdel))
0 hiện được xác định chính xác là trừu tượng khi được áp dụng cho một phương pháp trừu tượng:

class C(ABC):
    @classmethod
    @abstractmethod
    def my_abstract_classmethod(cls, arg):
        ...

________ 60 ________ 19 ________ 85¶

Mới trong phiên bản 3.2.

Không dùng nữa kể từ phiên bản 3.3: Bây giờ có thể sử dụng

class C(ABC):
    @abstractmethod
    def my_abstract_method(self, arg1):
        ...
    @classmethod
    @abstractmethod
    def my_abstract_classmethod(cls, arg2):
        ...
    @staticmethod
    @abstractmethod
    def my_abstract_staticmethod(arg3):
        ...

    @property
    @abstractmethod
    def my_abstract_property(self):
        ...
    @my_abstract_property.setter
    @abstractmethod
    def my_abstract_property(self, val):
        ...

    @abstractmethod
    def _get_x(self):
        ...
    @abstractmethod
    def _set_x(self, val):
        ...
    x = property(_get_x, _set_x)
8 với
class Foo:
    def __getitem__(self, index):
        ...
    def __len__(self):
        ...
    def get_iterator(self):
        return iter(self)

class MyIterable(ABC):

    @abstractmethod
    def __iter__(self):
        while False:
            yield None

    def get_iterator(self):
        return self.__iter__()

    @classmethod
    def __subclasshook__(cls, C):
        if cls is MyIterable:
            if any("__iter__" in B.__dict__ for B in C.__mro__):
                return True
        return NotImplemented

MyIterable.register(Foo)
5, làm cho bộ trang trí này trở nên dư thừa.It is now possible to use
class Descriptor:
    ...
    @property
    def __isabstractmethod__(self):
        return any(getattr(f, '__isabstractmethod__', False) for
                   f in (self._fget, self._fset, self._fdel))
6 with
class Foo:
    def __getitem__(self, index):
        ...
    def __len__(self):
        ...
    def get_iterator(self):
        return iter(self)

class MyIterable(ABC):

    @abstractmethod
    def __iter__(self):
        while False:
            yield None

    def get_iterator(self):
        return self.__iter__()

    @classmethod
    def __subclasshook__(cls, C):
        if cls is MyIterable:
            if any("__iter__" in B.__dict__ for B in C.__mro__):
                return True
        return NotImplemented

MyIterable.register(Foo)
5, making this decorator redundant.

Một lớp con của

class Descriptor:
    ...
    @property
    def __isabstractmethod__(self):
        return any(getattr(f, '__isabstractmethod__', False) for
                   f in (self._fget, self._fset, self._fdel))
0 tích hợp, chỉ ra một lớp học trừu tượng. Nếu không, nó tương tự như
class Foo:
    def __getitem__(self, index):
        ...
    def __len__(self):
        ...
    def get_iterator(self):
        return iter(self)

class MyIterable(ABC):

    @abstractmethod
    def __iter__(self):
        while False:
            yield None

    def get_iterator(self):
        return self.__iter__()

    @classmethod
    def __subclasshook__(cls, C):
        if cls is MyIterable:
            if any("__iter__" in B.__dict__ for B in C.__mro__):
                return True
        return NotImplemented

MyIterable.register(Foo)
5.

Trường hợp đặc biệt này không được chấp nhận, vì người trang trí

class Descriptor:
    ...
    @property
    def __isabstractmethod__(self):
        return any(getattr(f, '__isabstractmethod__', False) for
                   f in (self._fget, self._fset, self._fdel))
0 hiện được xác định chính xác là trừu tượng khi được áp dụng cho một phương pháp trừu tượng:

class Shape(abc.ABC):
   @abc.abstractmethod
   def area(self):
      pass
0

________ 60 ________ 19 ________ 93¶

Không dùng nữa kể từ phiên bản 3.3: Bây giờ có thể sử dụng

class C(ABC):
    @abstractmethod
    def my_abstract_method(self, arg1):
        ...
    @classmethod
    @abstractmethod
    def my_abstract_classmethod(cls, arg2):
        ...
    @staticmethod
    @abstractmethod
    def my_abstract_staticmethod(arg3):
        ...

    @property
    @abstractmethod
    def my_abstract_property(self):
        ...
    @my_abstract_property.setter
    @abstractmethod
    def my_abstract_property(self, val):
        ...

    @abstractmethod
    def _get_x(self):
        ...
    @abstractmethod
    def _set_x(self, val):
        ...
    x = property(_get_x, _set_x)
2,
class C(ABC):
    @classmethod
    @abstractmethod
    def my_abstract_classmethod(cls, arg):
        ...
5,
class C(ABC):
    @classmethod
    @abstractmethod
    def my_abstract_classmethod(cls, arg):
        ...
6 và
class C(ABC):
    @classmethod
    @abstractmethod
    def my_abstract_classmethod(cls, arg):
        ...
7 với
class Foo:
    def __getitem__(self, index):
        ...
    def __len__(self):
        ...
    def get_iterator(self):
        return iter(self)

class MyIterable(ABC):

    @abstractmethod
    def __iter__(self):
        while False:
            yield None

    def get_iterator(self):
        return self.__iter__()

    @classmethod
    def __subclasshook__(cls, C):
        if cls is MyIterable:
            if any("__iter__" in B.__dict__ for B in C.__mro__):
                return True
        return NotImplemented

MyIterable.register(Foo)
5, làm cho người trang trí này trở nên dư thừa.It is now possible to use
class C(ABC):
    @abstractmethod
    def my_abstract_method(self, arg1):
        ...
    @classmethod
    @abstractmethod
    def my_abstract_classmethod(cls, arg2):
        ...
    @staticmethod
    @abstractmethod
    def my_abstract_staticmethod(arg3):
        ...

    @property
    @abstractmethod
    def my_abstract_property(self):
        ...
    @my_abstract_property.setter
    @abstractmethod
    def my_abstract_property(self, val):
        ...

    @abstractmethod
    def _get_x(self):
        ...
    @abstractmethod
    def _set_x(self, val):
        ...
    x = property(_get_x, _set_x)
2,
class C(ABC):
    @classmethod
    @abstractmethod
    def my_abstract_classmethod(cls, arg):
        ...
5,
class C(ABC):
    @classmethod
    @abstractmethod
    def my_abstract_classmethod(cls, arg):
        ...
6 and
class C(ABC):
    @classmethod
    @abstractmethod
    def my_abstract_classmethod(cls, arg):
        ...
7 with
class Foo:
    def __getitem__(self, index):
        ...
    def __len__(self):
        ...
    def get_iterator(self):
        return iter(self)

class MyIterable(ABC):

    @abstractmethod
    def __iter__(self):
        while False:
            yield None

    def get_iterator(self):
        return self.__iter__()

    @classmethod
    def __subclasshook__(cls, C):
        if cls is MyIterable:
            if any("__iter__" in B.__dict__ for B in C.__mro__):
                return True
        return NotImplemented

MyIterable.register(Foo)
5, making this decorator redundant.

Một lớp con của

class C(ABC):
    @classmethod
    @abstractmethod
    def my_abstract_classmethod(cls, arg):
        ...
9 tích hợp, chỉ ra một thuộc tính trừu tượng.

Trường hợp đặc biệt này không được chấp nhận, vì người trang trí

class C(ABC):
    @classmethod
    @abstractmethod
    def my_abstract_classmethod(cls, arg):
        ...
9 hiện được xác định chính xác là trừu tượng khi được áp dụng cho một phương pháp trừu tượng:

class Shape(abc.ABC):
   @abc.abstractmethod
   def area(self):
      pass
1

Ví dụ trên xác định một thuộc tính chỉ đọc; Bạn cũng có thể định nghĩa một thuộc tính trừu tượng đọc-viết bằng cách đánh dấu một cách thích hợp một hoặc nhiều phương thức cơ bản là trừu tượng:

class Shape(abc.ABC):
   @abc.abstractmethod
   def area(self):
      pass
2

Nếu chỉ có một số thành phần là trừu tượng, chỉ các thành phần đó cần được cập nhật để tạo một thuộc tính cụ thể trong một lớp con:

class Shape(abc.ABC):
   @abc.abstractmethod
   def area(self):
      pass
3

Mô -đun

from abc import ABC

class MyABC(ABC):
    pass

MyABC.register(tuple)

assert issubclass(tuple, MyABC)
assert isinstance((), MyABC)
9 cũng cung cấp các chức năng sau:

________ 19 ________ 103 ()()

Trả về mã bộ nhớ cache lớp cơ sở trừu tượng hiện tại.

Mã thông báo là một đối tượng mờ đục (hỗ trợ kiểm tra bình đẳng) xác định phiên bản hiện tại của bộ đệm lớp cơ sở trừu tượng cho các lớp con ảo. Mã thông báo thay đổi với mỗi cuộc gọi đến

class Shape(abc.ABC):
   @abc.abstractmethod
   def area(self):
      pass
04 trên bất kỳ ABC nào.

Mới trong phiên bản 3.4.

________ 19 ________ 106 (CLS) ¶(cls)

Một chức năng để tính toán lại một trạng thái trừu tượng của lớp trừu tượng. Hàm này nên được gọi là nếu một phương thức trừu tượng của lớp đã được thực hiện hoặc thay đổi sau khi nó được tạo. Thông thường, chức năng này nên được gọi từ trong một người trang trí lớp.

Trả về CLS, để cho phép sử dụng như một người trang trí lớp.

Nếu CLS không phải là một ví dụ của

class Shape(abc.ABC):
   @abc.abstractmethod
   def area(self):
      pass
7, không làm gì cả.

Ghi chú

Chức năng này giả định rằng các siêu lớp CLS đã được cập nhật. Nó không cập nhật bất kỳ lớp con.

Mới trong phiên bản 3.10.

Chú thích

1

Các lập trình viên C ++ cần lưu ý rằng khái niệm lớp cơ sở ảo Python không giống như C ++.

ABC trong Python là gì?

Mã nguồn: lib/abc.py. Mô -đun này cung cấp cơ sở hạ tầng để xác định các lớp cơ sở trừu tượng (ABC) trong Python, như được nêu trong PEP 3119; Xem PEP cho lý do tại sao điều này đã được thêm vào Python. (Xem thêm PEP 3141 và mô -đun số liên quan đến phân cấp loại cho các số dựa trên ABC.)

ABC AbstractMethod làm gì?

ABC. Tóm tắtMethod (chức năng) Một trình trang trí chỉ ra các phương pháp trừu tượng. Sử dụng bộ 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ó metaclass có nguồn gốc từ ABCMeta không thể được khởi tạo trừ khi tất cả các phương thức và thuộc tính trừu tượng của nó được ghi đè.A decorator indicating abstract methods. Using this decorator requires that the class's metaclass is ABCMeta or is derived from it. A class that has a metaclass derived from ABCMeta cannot be instantiated unless all of its abstract methods and properties are overridden.

Sự khác biệt giữa ABC và ABCMeta là gì?

ABCMETA.tức là abc.ABC ngầm định xác định metaclass cho chúng tôi.Sự khác biệt duy nhất là trong trường hợp trước, bạn cần một kế thừa đơn giản và ở sau bạn cần chỉ định Metaclass.in the former case you need a simple inheritance and in the latter you need to specify the metaclass.

Một lớp cơ sở trong Python là gì?

Kế thừa cho phép chúng tôi xác định một lớp kế thừa tất cả các phương thức và thuộc tính từ một lớp khác.Lớp cha là lớp được kế thừa, còn được gọi là lớp cơ sở.Parent class is the class being inherited from, also called base class.