是否有一个内置的ABC来强制__str__
在子类中实现?或者输入协议?
我想要一个只接受__str__
、__hash__
和__eq__
类的函数。我找到了Hashable
,但没有找到Stringable
没有这样的内置ABC
。实际上,每个类都有这个从object
继承来的方法:
内置类型object定义的默认实现调用object.repr() .
见文档。
In [1]: class Foo: pass
In [2]: str(Foo())
Out[2]: '<__main__.Foo object at 0x7fcf10e219f0>'
In [3]: print(Foo())
<__main__.Foo object at 0x7fcf10e23d00>
In [4]: print(Foo().__str__())
<__main__.Foo object at 0x7fcf10e20d60>
In [5]: print(Foo().__repr__())
<__main__.Foo object at 0x7fcf10e20af0>
In [6]: object().__repr__()
Out[6]: '<object object at 0x7fcf119c6810>'
In [7]: object().__str__()
Out[7]: '<object object at 0x7fcf119c67c0>'
没有这样的内置抽象类,但是您可以强制执行这些需求。
from abc import ABC, abstractmethod
class Required(ABC):
@abstractmethod
def __str__(self) -> str:
...
@abstractmethod
def __hash__(self) -> int:
...
@abstractmethod
def __eq__(self, other) -> bool:
...
>>> class Impl(Required): ...
>>> i = Impl()
TypeError: Can't instantiate abstract class Impl with abstract methods __eq__, __hash__, __str__
另外,您可以在运行时检查特定的结构子类型是否相等,如果不是这样,则返回TypeError
(但这可能不是最佳实践):
from typing import Protocol, runtime_checkable
@runtime_checkable
class HasValue(Protocol):
value: int
class Impl(Required):
# also define __str__ and __hash__
@property
def value(self):
return 42
def __eq__(self, other):
if not isinstance(other, HasValue):
raise TypeError
return self.value == other.value
class Valued:
value = 42
class NotValued:
...
>>> i = Impl()
>>> v = Valued()
>>> n = NotValued()
>>> i == v # both have self.value
True
>>> v == n # self.value not enforced
False
>>> i == n # self.value enforced
TypeError