5

PythonでC#のような仮想関数と純粋仮想関数を模倣する最良の方法は何ですか?

現在、次のようなスキーマを使用しています。

class AbstractClass(object):
    '''Abstract class'''
    def __init__(self):
        assert False, 'Class cannot be instantiated'

    def _virtual_init(self):
        print 'Base "constructor"'

    def pure_virtual_function(self):
        assert False, 'Pure virtual function should be derived'

    def virtual_function(self):
        print 'Base: virtual function'

class Derived1(AbstractClass):
    '''All functions derived'''
    def __init__(self):
        print 'Derived1: constructor'
        AbstractClass._virtual_init(self)

    def pure_virtual_function(self):
        print 'Derived1: pure virtual function'

    def virtual_function(self):
        print 'Derived1: virtual function'

class Derived2(AbstractClass):
    '''Pure virtual method missing.'''
    def __init__(self):
        print 'Derived2: constructor'
        AbstractClass._virtual_init(self)

    def virtual_function(self):
        print 'Derived3: virtual function'

class Derived3(AbstractClass):
    '''Virtual method missing (use base class)'''
    def __init__(self):
        print 'Derived3: constructor'
        AbstractClass._virtual_init(self)

    def pure_virtual_function(self):
        print 'Derived3: pure virtual function'


# ab = AbstractClass() # Gives error -> OK

print 'DERIVED 1'    
dv1 = Derived1()
dv1.pure_virtual_function()
dv1.virtual_function()

print 'DERIVED 2'    
dv2 = Derived2()
# dv2.pure_virtual_function() # Gives error: Pure virtual function should be derived -> OK
dv2.virtual_function()

print 'DERIVED 3'    
dv3 = Derived3()
# dv3.pure_virtual_function() # Gives error: Pure virtual function should be derived -> OK
dv3.virtual_function()

私は出力として得ます:

DERIVED 1
Derived1: constructor
Base "constructor"
Derived1: pure virtual function
Derived1: virtual function
DERIVED 2
Derived2: constructor
Base "constructor"
Derived3: virtual function
DERIVED 3
Derived3: constructor
Base "constructor"
Derived3: pure virtual function
Base: virtual function

ただし、私の具体的な質問は次のとおりです。

  1. Python (2.7) で抽象基本クラスを定義するよりエレガントな方法はありますか? 上記の解決策は、実行時にのみエラーを返します (たとえば、pylint ではありません) Python afaik には「abstract」キーワードはありません。
  2. Python (2.7) で純粋仮想メソッドを定義するよりエレガントな方法はありますか? 繰り返しますが、上記の解決策では実行時にのみエラーが発生します。
  3. Python (2.7) で仮想メソッドを定義するよりエレガントな方法はありますか? チェックは必要ありませんが、Python afaik には「virtual」のようなキーワードはありません。

前もって感謝します。

4

2 に答える 2

0
class AbstractBaseClass(object):
    def __init__(self):
        if self.__class__.__name__ == 'AbstractBaseClass':
            raise NotImplementedError("Can't instantiate AbstractBaseClass")

class DerivedClass(AbstractBaseClass):
    def __init__(self):
        super().__init__()
        # ...

この例は、(異なる__class__.__name__メンバーを持つ) 派生クラスをインスタンス化し、AbstractBaseClass によって提供される属性を継承できることを示しています。ただし、AbstractBaseClass が直接インスタンス化されると、NotImplementedError例外がスローされます。

于 2016-12-27T21:22:29.400 に答える