码迷,mamicode.com
首页 > 编程语言 > 详细

Python类私有方法的陷阱

时间:2015-07-09 18:11:58      阅读:149      评论:0      收藏:0      [点我收藏+]

标签:python   陷阱   私有方法   继承   

引言

Python不像C++、Java、C#等有明确的公共、私有或受保护的关键字来定义成员函数或属性,它使用约定的单下划线“_"和"__"双下划线作为函数或属性的前缀来标识。使用单下划线还是双下划线,是有很大的区别的。

1. 单下划线的函数或属性,在类定义中可以调用和访问,类的实例可以直接访问,子类中可以访问;

2. 双下划线的函数或属性,在类定义中可以调用和访问,类的实例不可以直接访问,子类不可访问。

注意:对于双下划线的函数或属性,Python解释器使用了名字混淆的方法, 将私有的方法"__method"变成了"_classname__method"了,具体看下文示例。



双下划线的私有函数和属性,在子类中不可见,不存在”覆盖“

class Base(object):
    def __private(self):
        print("private value in Base")

    def _protected(self):
        print("protected value in Base")

    def public(self):
        print("public value in Base")
        self.__private()
        self._protected()

class Derived(Base):
    def __private(self):
        print("override private")

    def _protected(self):
        print("override protected")


print dir(Base)
print("="*80)
d = Derived()
d.public()
d._protected()
d._Derived__private()
print("="*80)
d.__private()
输出结果如下:

>>> 
['_Base__private', '__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_protected', 'public']
================================================================================
public value in Base
private value in Base
override protected
override protected
override private
================================================================================

Traceback (most recent call last):
  File "D:\temp\test.py", line 91, in <module>
    d.__private()
AttributeError: 'Derived' object has no attribute '__private'
>>> 




版权声明:本文为博主原创文章,未经博主允许不得转载。

Python类私有方法的陷阱

标签:python   陷阱   私有方法   继承   

原文地址:http://blog.csdn.net/thomashtq/article/details/46817591

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!