假设我创建了一个名为Ball
. 作为子类,我然后继续创建Basketball
,Baseball
和Tennisbal
. 但是我不希望我的用户创建一个实例,Ball
因为它不够具体。我想通过创建任何子类的实例来强制用户直接创建特定的球。如何拒绝访问父类并保持子类可访问?
问问题
147 次
2 回答
1
基本上,你不能在严格意义上。python 中的每个类和方法都是公共的,所以这是不可能的。你可以做一些修改,但如果有人考虑使用它,它仍然不会停止。
按照惯例,大多数 Python 程序员都会在方法或属性前面加上 _ 来表示内部方法。但没有什么能阻止它。
mangling 的一个例子(摘自 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。
(编辑)
这个建议的目的是保持简单。如果你需要初始化,你可以让你的基类检查所有实现者必须拥有的东西,或者只是创建一个标志来告诉你发生了什么:
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 回答