首页 > 后端开发 > Python教程 > Python 的'私有”方法封装是一个神话吗?

Python 的'私有”方法封装是一个神话吗?

Mary-Kate Olsen
发布: 2024-12-05 19:16:11
原创
865 人浏览过

Is Python's

Python 的“私有”方法:揭开封装的神话

与它的名字相反,Python 的“私有”方法并不完全私有。虽然在方法名称前面添加双下划线(例如 __myPrivateMethod())会造成隐私的错觉,但 Python 通过具有修改名称的动态生成的方法公开这些方法。

请考虑以下代码:

class MyClass:
    def myPublicMethod(self):
        print('public method')

    def __myPrivateMethod(self):
        print('this is private!!')

obj = MyClass()
登录后复制

调用 obj.myPublicMethod() 成功调用公共方法。然而,尝试调用 obj.__myPrivateMethod() 会导致 AttributeError。

通过 dir(obj) 深入研究这个问题,我们发现了一个新方法:

dir(obj)
# Output: ['_MyClass__myPrivateMethod', '__doc__', '__module__', 'myPublicMethod']
登录后复制

这个动态生成的名为 _MyClass__myPrivateMethod 的方法,维护对所谓私有方法的引用。

尽管名称扰乱,目的不是为了防止故意的外部访问。相反,它确保子类不会意外覆盖超类的私有方法和属性。考虑下面的例子:

class Foo(object):
    def __init__(self):
        self.__baz = 42

    def foo(self):
        print(self.__baz)

class Bar(Foo):
    def __init__(self):
        super(Bar, self).__init__()
        self.__baz = 21

    def bar(self):
        print(self.__baz)

x = Bar()
x.foo()  # Output: 42
x.bar()  # Output: 21
print(x.__dict__)
# Output: {'_Bar__baz': 21, '_Foo__baz': 42}
登录后复制

子类仍然可以通过修改后的名称访问被重写的私有属性或方法。

综上所述,Python 的“私有”方法在面向对象编程原理的感觉。它们只是一种防止意外覆盖的机制,但无法防止故意的外部访问。

以上是Python 的'私有”方法封装是一个神话吗?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板