小编典典

在python子类中将方法设为私有

python

是否可以将公共方法私有化为子类?我不希望其他扩展该类的类能够调用某些方法。这是一个例子:

class A:
    def __init__(self):
        #do something here

    def method(self):
        #some code here

class B(A):
    def __init__(self):
        A.__init__(self)
        #additional initialization goes here

    def method(self):
        #this overrides the method ( and possibly make it private here )

从现在开始,我不希望任何从B扩展的类都可以调用method。这可能吗?

编辑:这样做的“逻辑”原因是我不希望用户以错误的顺序调用方法。


阅读 216

收藏
2021-01-20

共1个答案

小编典典

Python作为源分发。私有方法的想法毫无意义。

想要扩展的程序员(B由于隐私问题而感到沮丧)会查看B源代码,然后将源代码复制并粘贴method到子类中C

您通过“隐私权”获得了什么?您最好的期望是挫败您的潜在客户进行复制和粘贴。

最糟糕的是,他们因为无法扩展而丢弃了您的包裹。

是的,所有开源都以一种或另一种方式扩展。您无法预见将要进行编码的所有内容和每种用途。当代码作为源分发时,很难防止将来使用。


编辑 “防白痴”代码。

首先,python 90%的时间作为源分发。因此,任何下载,安装然后拒绝阅读API指南并以无序方式调用方法的白痴仍然可以找出问题的出处。

我们有三类白痴。

  • 那些拒绝阅读API指南(或略过它而忽略相关部分)并尽管有文档但仍乱序调用方法的人。您可以尝试将某些内容设为私有,但这无济于事,因为他们会做其他错误的事情-并对此抱怨。[我不会命名,但是我与那些似乎花费大量时间不正确地调用API的人一起工作。另外,您还会在SO上看到类似的问题。]

您只能为他们提供剪切和粘贴的有效代码示例,以帮助他们。

  • 那些被API迷惑并以各种您可以想像的方式(甚至有些您不能想象的)调用方法的人。您可以尝试将某些东西设为私有,但他们永远都不会获得API。

您只能通过提供工作代码示例来帮助他们。即使这样,他们也会错误地剪切和粘贴它。

  • 拒绝您的API并想要重写它以使其成为“白痴证明”的人。

您可以为他们提供有效的代码示例,但是他们不喜欢您的API,因此会坚持重写它。他们会告诉您您的API是疯狂的,并且已经对其进行了改进。

您可以让这些人参与不断升级的“防白痴”军备竞赛。您放在一起的所有内容都会分解。

在这一点上,隐私为您做了什么?有些人会拒绝理解它。有些人对此感到困惑;有些人想解决它。

公众如何呢,并让您称呼“白痴”的人们从您的代码中学习?

2021-01-20