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