0

という名前の親クラスを作成するとしますBallBasketball子クラスとして、 、Baseballおよびを作成し続けますTennisbalBallただし、十分に具体的ではないため、ユーザーに のインスタンスを作成させたくありません。いずれかの子クラスのインスタンスを作成して、ユーザーに特定のボールを直接作成させたいと考えています。親クラスへのアクセスを拒否し、子クラスへのアクセスを維持するにはどうすればよいですか?

4

2 に答える 2

1

基本的に、厳密にはできません。Python のすべてのクラスとメソッドは公開されているため、それは不可能です。マングリングを行うことはできますが、誰かがそれを使用することを考えている場合でも、停止することはありません.

慣例により、ほとんどの Python プログラマーはメソッドまたは属性の前に _ を付けて、内部メソッドを示します。しかし、それを止めるものは何もありません。

マングリングの例 (Python 3 Object Oriented Programming Using Python からの抜粋):

class SecretString:
  '''A not-at-all secure way to store a secret string.'''

    def __init__(self, plain_string, pass_phrase):
       self.__plain_string = plain_string
       self.__pass_phrase = pass_phrase

def decrypt(self, pass_phrase):
    '''Only show the string if the pass_phrase is correct.'''
      if pass_phrase == self.__pass_phrase:
     return self.__plain_string
     else:
      return ''

これを試してみましょう:

>>> secret_string = SecretString("ACME: Top Secret", "antwerp")
>>> print(secret_string.decrypt("antwerp"))
ACME: Top Secret
>>> print(secret_string.__plain_text)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError:

おお!出来た。

さて、これ:

>>> print(secret_string._SecretString__plain_string)
ACME: Top Secret

いいえ、失敗しました。

上記は、最良の意味で使用できる名前マングリングの一例です。

于 2013-08-15T14:06:47.590 に答える
0

Ball.__init__() で NotImplementedError を発生させます。

(編集)

この提案の目標は、シンプルに保つことです。init が必要な場合は、すべての実装者が持つ必要があるものを基本クラスにチェックさせるか、何が起こっているかを知らせるフラグを作成することができます。

class A(object):
    _abstract = True

    def __init__(self):
        if self._abstract:
            raise NotImplementedError("Cannot instantiate abstract base class")

class B(A):
    _abstract = False
于 2013-08-15T14:13:18.440 に答える