Это немного бессмысленно для __gt__
и __eq__
, потому что object
имеет эти атрибуты.
@ timgeb: Не подумал об этом, если честно, хорошая мысль. Вопрос действительно в том, чтобы задокументировать этот тип утки, так что давайте представим, что это не так? :)
В общем случае, я полагаю, вы можете написать себе азбуку, которая реализует __subclasshook__
, а затем напечатать этот класс.
from abc import ABCMeta, abstractmethod
class FooAndBar(metaclass=ABCMeta):
@abstractmethod
def foo(self):
raise NotImplementedError
@abstractmethod
def bar(self):
raise NotImplementedError
@classmethod
def __subclasshook__(cls, C):
if cls is FooAndBar:
has_foo = any('foo' in X.__dict__ for X in C.__mro__)
has_bar = any('bar' in X.__dict__ for X in C.__mro__)
if has_foo and has_bar:
return True
return NotImplemented
class Foo:
def foo(self):
pass
class FooBar:
def foo(self):
pass
def bar(self):
pass
print(isinstance(Foo(), FooAndBar)) # False
print(issubclass(Foo, FooAndBar)) # False
print(isinstance(FooBar(), FooAndBar)) # True
print(issubclass(FooBar, FooAndBar)) # True
def func(arg: FooAndBar):
pass
Обратите внимание, что определение foo
и bar
в FooAndBar
не требуется для вашей конкретной цели (в любом случае срабатывает подкласс), но пропуск методов будет выглядеть очень странно для меня, и, вероятно, для любого читателя кода.