2017-12-26 7 views
1

私はサブクラスがいくつかのメソッドをオーバーライドできないときににいくつかの機能を実装することができることを知っています。サブクラスが特定の基本クラスメソッドをオーバーライドする場合にのみ発生しますか?

def some_method(self): 
    raise NotImplementedError 

しかし、私は反対のことを行うことができますどのように、すなわち、サブクラスはこのメソッドをオーバーライドしないだけ昇給?

ありがとうございます!

編集:私は名前空間の衝突が、ここでは適用されませんのGetItem/GETATTRをオーバーライドから人々を防ぐためにしようとしています。

編集:既にサブクラスメソッドがベースクラスメソッドかどうかを確認しようとしました。これはPythonではなくCPythonで動作します。オールラウンドソリューションはありますか?

+2

を高めることですか?おそらく二重アンダースコア規則を代わりに使用するべきですか? –

+0

[Pythonのサブクラスで実装メソッド名の衝突を回避する]の可能な複製(https://stackoverflow.com/questions/30543615/python-avoiding-implementation-method-name-clashes-in-subclass) –

+0

私は防止しようとしています'__getitem__/__getattr__'をオーバーライドします –

答えて

0

あなたはメソッドがスーパークラスと同じ方法でオブジェクトであるかどうかを確認することができます。もちろん

def is_base_impl(obj): 
    return obj.__getattr__ is BaseClass.__getattr__ 

を、これが唯一の意図しない上書きを検出します。サブクラスがこれを行うと判断された場合は、サブタイトルBaseClassの代わりにmonkey-patchを使用できます。

+0

これは私がCPythonで働いていたのですが、PyPyではありませんでした...しかし、 –

+2

JITの存在下では、すべての賭けはオフになっています。最初に、あなたがこれを試したこととあなたが使っているプラ​​ットフォームの両方について、関連する情報を質問に入れておくべきです。 –

+2

正直なところ、あなたの質問に実際に答えなかった場合は、この回答を受け入れるべきではありません。 –

0

__init__()時には、some_method()の詳細については、inspect.getmembers()を使用してください。次に、メソッドの動作をテストするか、必要に応じてメソッドをレポートするかを選択できます。この問題を解決するための

1

一つの方法は、あなたが防ぐために何をしようとしているメタクラスを使用して、作成中にチェックし、この方法はbodyの一部である場合とtypeError

class BaseMeta(type): 
    def __new__(cls, name, bases, body): 
     if 'bar' in body: 
      raise TypeError("bad user class") 
     return super().__new__(cls, name, bases, body) 


class Base(metaclass=BaseMeta): 
    def bar(self): 
     return None 


class Derived(object): 
    def bar(self): 
     return 'bar' 
関連する問題