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 metaclass
es.
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
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 |