10

Python には、sealed クラスに似たものがありますか? Javaでは、最終クラスとしても知られていると思います。

言い換えれば、Python では、クラスをマークして継承や展開ができないようにすることはできますか? Pythonはそのような機能を持つことを考えたことがありますか? なんで?

免責事項

実際に、封印されたクラスが存在する理由を理解しようとしています。ここでの回答(および多くの多くの多くの多くの多くの本当に多くの他の場所での) 回答は私をまったく満足させなかったので、別の角度から見ようとしています。この質問に対する理論的な回答は避けて、タイトルに注目してください。または、主張する場合は、少なくともcsharp のシールされたクラスの非常に優れた実用的な例 を1 つ挙げてください。

私はどちらの言語の専門家でもありませんが、両方について少し知っています。ちょうど昨日、csharp でコーディングしているときに、sealed クラスの存在を知りました。そして今、Pythonにそれに相当するものがあるかどうか疑問に思っています。その存在には非常に正当な理由があると私は信じていますが、私は本当にそれを理解していません.

4

4 に答える 4

14

メタクラスを使用して、サブクラス化を防ぐことができます。

class Final(type):
    def __new__(cls, name, bases, classdict):
        for b in bases:
            if isinstance(b, Final):
                raise TypeError("type '{0}' is not an acceptable base type".format(b.__name__))
        return type.__new__(cls, name, bases, dict(classdict))

class Foo:
    __metaclass__ = Final

class Bar(Foo):
    pass

与えます:

>>> class Bar(Foo):
...     pass
... 
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 5, in __new__
TypeError: type 'Foo' is not an acceptable base type

この__metaclass__ = Final行により、Fooクラスが「封印」されます。

.NET では、パフォーマンス測定としてシール クラスを使用することに注意してください。直接アドレス指定できるサブクラス化メソッドがないためです。Python メソッド ルックアップの動作は大きく異なります。メソッド ルックアップに関しては、上記の例のようなメタクラスを使用することに利点も欠点もありません。

于 2013-05-15T11:48:32.783 に答える