如何拒绝用户在Python中创建父对象的实例

2024-10-01 02:39:59 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我创建了一个名为Ball的父类。作为子类,我继续创建BasketballBaseballTennisbal。但是,我不希望我的用户创建Ball的实例,因为它不够具体。我想通过创建任何子类的实例来强制用户直接创建一个特定的ball。如何拒绝访问父类并保持子类的可访问性?你知道吗


Tags: 实例用户子类ballbasketballbaseball父类tennisbal
2条回答

有球。\ uuuu init \ uuuuuuuuu()升起未执行错误。你知道吗

(编辑)

这个建议的目的是保持简单。如果需要init,可以让基类检查所有实现者必须具备的功能,或者创建一个标志来告诉您发生了什么:

class A(object):
    _abstract = True

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

class B(A):
    _abstract = False

基本上,从严格意义上说,你不能。python中的每个类和方法都是公共的,所以这是不可能的。你可以做一些破坏,但它仍然不会停止,如果有人正在考虑使用它。你知道吗

按照惯例,大多数python程序员都会在方法或属性前面加上u来表示内部方法。但没有什么能阻止它。你知道吗

一个损坏的例子(摘自使用Python的python3面向对象编程):

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

不,它失败了。

以上是一个名称损坏的例子,你可以用在最好的意义上。你知道吗

相关问题 更多 >