Python为什么很多第三方lib用_xxx而不用__xxx?

Posted 帅气的黑桃J

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python为什么很多第三方lib用_xxx而不用__xxx?相关的知识,希望对你有一定的参考价值。

看了很多lib的源码,一直很疑惑为什么很多不想让外界访问的function和param的权限是protected,基本没有人用private,直到我看到 python 类的 public protected private 属性 -csdn 这篇回答。


protected以单个下划线开头的属性,这是为了尽量减少无意间访问内部属性所带来的意外,用一种习惯性的命名方式来表示该字段受保护,本类之外的代码使用该字段时要小心。它本质上与 public 属性使用相同,但命名上体现了保护目的。

Python 为什么不从语法上严格保证 private 字段的私密性呢?用最简单的话讲,We are all consenting adults here(我们都是成年人了)。这也是很多 Python 程序员的观点,大家都认为开放要比封闭好。

另外一个原因在于 Python 语言本身就已经提供了一些属性挂钩(getattr 等),使得开发者能够按照自己的需要来操作对象内部的数据。既然如此,那为什么还要阻止访问 private 属性呢?

最后,不要盲目地将属性设为 private,而是应该从一开始就做好规划,并允许子类更多地访问超类的内部 API;只有当子类不受自己控制时,才考虑用 private 属性来避免命名冲突。

参考Random库中SystemRandom函数_notimplemented

class SystemRandom(Random):
    """Alternate random number generator using sources provided
    by the operating system (such as /dev/urandom on Unix or
    CryptGenRandom on Windows).

     Not available on all systems (see os.urandom() for details).
    """

    def random(self):
        """Get the next random number in the range [0.0, 1.0)."""
        return (int.from_bytes(_urandom(7), 'big') >> 3) * RECIP_BPF

    def getrandbits(self, k):
        """getrandbits(k) -> x.  Generates an int with k random bits."""
        if k <= 0:
            raise ValueError('number of bits must be greater than zero')
        if k != int(k):
            raise TypeError('number of bits should be an integer')
        numbytes = (k + 7) // 8                       # bits / 8 and rounded up
        x = int.from_bytes(_urandom(numbytes), 'big')
        return x >> (numbytes * 8 - k)                # trim excess bits

    def seed(self, *args, **kwds):
        "Stub method.  Not used for a system random number generator."
        return None

    def _notimplemented(self, *args, **kwds):
        "Method should not be called for a system random number generator."
        raise NotImplementedError('System entropy source does not have state.')
    getstate = setstate = _notimplemented

以上是关于Python为什么很多第三方lib用_xxx而不用__xxx?的主要内容,如果未能解决你的问题,请参考以下文章

python debug 出来的东西怎么理解 圈里面 画的

的Python:什么“类型错误‘xxx’的对象不是可调用”的意思?

post提交方式为什么要序列化,而Get提交方式就不用?序列化做了什么?

壹拾陆

[Python] 利用python的第三方库xlrd和xlwt来处理excel数据

信息学竞赛用C++不用Python的原因是啥?