これは私が望むセットアップです: A は、静的および抽象メソッド f() を持つ抽象基本クラスである必要があります。B は A から継承する必要があります。要件: 1. A をインスタンス化できない必要があります 2. 静的な f() を実装しない限り、B をインスタンス化できない必要があります
この質問からインスピレーションを得て、いくつかのアプローチを試しました。これらの定義では:
class abstractstatic(staticmethod):
__slots__ = ()
def __init__(self, function):
super(abstractstatic, self).__init__(function)
function.__isabstractmethod__ = True
__isabstractmethod__ = True
class A:
__metaclass__ = abc.ABCMeta
@abstractstatic
def f():
pass
class B(A):
def f(self):
print 'f'
class A2:
__metaclass__ = abc.ABCMeta
@staticmethod
@abc.abstractmethod
def f():
pass
class B2(A2):
def f(self):
print 'f'
ここで、A2 と B2 は通常の Python 規則を使用して定義され、A & B はこの回答で提案されている方法を使用して定義されます。以下は、私が試したいくつかの操作と、望ましくない結果です。
クラス A/B の場合:
>>> B().f()
f
#This should have thrown, since B doesn't implement a static f()
クラス A2/B2 の場合:
>>> A2()
<__main__.A2 object at 0x105beea90>
#This should have thrown since A2 should be an uninstantiable abstract class
>>> B2().f()
f
#This should have thrown, since B2 doesn't implement a static f()
これらのアプローチのどちらも私が望む出力を与えないので、どうすれば私が望むものを達成できますか?