3

これは私が望むセットアップです: 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()

これらのアプローチのどちらも私が望む出力を与えないので、どうすれば私が望むものを達成できますか?

4

1 に答える 1