An ABC implementation without metaclass
Project description
plain-abc
Another ABC implementation without metaclass.
It is a little bit annoying to have metaclass conflict,
especially when trying to use ABC along with other libraries.
plain-abc provides a simple ABC implementation without metaclass.
Installation
pip install plain-abc
Usage
But you can also use plain-abc to solve the problem:
from abc import abstractmethod
from plain_abc import PlainABC
class _SomeHiddenMetaclass(type):
pass
class Base(metaclass=_SomeHiddenMetaclass):
pass
class IFoo(PlainABC):
@abstractmethod
def foo(self): ...
class Foo(Base, IFoo):
def foo(self): ...
To extend an abstract class as another abstract class,
PlainABC is required to be one of the bases:
from abc import abstractmethod
from plain_abc import PlainABC
class IEntity(PlainABC):
@abstractmethod
def get_id(self) -> str: ...
class IProjectile(IEntity, PlainABC):
@abstractmethod
def get_speed(self) -> float: ...
class Arrow(IProjectile):
def get_id(self) -> str: ...
def get_speed(self) -> float: ...
To skip signature checking,
you can add the member names in __abc_concrete_members__ of a subclass:
from abc import abstractmethod
from enum import Enum
from plain_abc import PlainABC
class IEnum(PlainABC):
@property
@abstractmethod
def foo(self) -> str:
...
class Foo(IEnum, Enum):
# for python 3.10 or lower
__abc_concrete_members__ = ('foo',)
foo = 'foo'
assert Foo.foo.value == 'foo'
To solve metaclass conflict without plain-abc
Here is an example of metaclass conflict
and how to mix ABCMeta with other metaclasses.
from abc import ABC, ABCMeta, abstractmethod
class _SomeHiddenMetaclass(type):
...
class Base(metaclass=_SomeHiddenMetaclass):
...
class IFoo(ABC):
@abstractmethod
def foo(self): ...
# oh no, metaclass conflict!
# class Foo(Base, IFoo):
# def foo(self): ...
# create a new metaclass to solve the conflict
class NewMetaclass(_SomeHiddenMetaclass, ABCMeta):
...
class Foo(Base, IFoo, metaclass=NewMetaclass):
def foo(self): ...
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file plain-abc-0.1.0.tar.gz.
File metadata
- Download URL: plain-abc-0.1.0.tar.gz
- Upload date:
- Size: 4.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/4.0.2 CPython/3.11.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
20b3e449b3c0773ca7a60420f62eef2b5e939d10deb871ae8d29e779ab3231e1
|
|
| MD5 |
0424efa0cfde04f25ecdae14793c4dec
|
|
| BLAKE2b-256 |
245717bae76e96771119ff1b120c0f569272591fca1f419e093e14204441d191
|
File details
Details for the file plain_abc-0.1.0-py3-none-any.whl.
File metadata
- Download URL: plain_abc-0.1.0-py3-none-any.whl
- Upload date:
- Size: 4.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/4.0.2 CPython/3.11.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
44e594e48065a6586e9d732ce0825488e4d0282f0ba229935bf5277264baaca6
|
|
| MD5 |
eecbb21eaab9865c5f60a561f4f4801a
|
|
| BLAKE2b-256 |
d8fd4a1ac1da0e548860af4347d6660f32d4c1268d6dd6800b29a3ec6990ad53
|