首先看一段代码:

  1. class Foo():
  2. def __init__(self):
  3. print "__init__ method"
  4.  
  5. def public_method(self):
  6. print "public_method"
  7.  
  8. def __private_method(self):
  9. print "__private_method"
  10.  
  11. def _halfprivate_method(self):
  12. print "_halfprivate_method"

这里我们定义了一个类Foo,类成员函数有双下划线方法__private_method和单下滑线方法_halfprivate_method,调用public_method和_halfprivate_method结果如下:

  1. f = Foo()
  2. f.public_method()
  3. f._halfprivate_method()
  4.  
  5. 结果:
  6. __init__ method
  7. public_method
  8. _halfprivate_method

显示没有问题。调用__private_method结果如下:

  1. f = Foo()
  2. f.__private_method()
  3.  
  4. 结果:
  5. Traceback (most recent call last):
  6. __init__ method
  7. File "C:/Python_Data_Analyse1/python下划线的意义.py", line 19, in <module>
  8. f.__private_method()
  9. AttributeError: Foo instance has no attribute '__private_method'

结果显示Foo的实例化的对象没有属性__private_method,但是如果使用_类__object的方式,就可以访问私有方法了,如下:

  1. f = Foo()
  2. f._Foo__private_method()

结论:python 的类实例化的对象可以调用单下划线开头的方法,不能调用双下划线的方法;

再看一段代码:

  1. class A(object):
  2. def __init__(self):
  3. self.__private()
  4. self.public()
  5.  
  6. def __private(self):
  7. print 'A.__private()'
  8.  
  9. def public(self):
  10. print 'A.public()'
  11.  
  12. class B(A):
  13. def __private(self):
  14. print 'B.__private()'
  15.  
  16. def public(self):
  17. print 'B.public()'
  18. b = B()

显示结果为:

  1. __init__ method
  2. A.__private()
  3. B.public()

实例化子类B就会执行__init__方法,调用静态方法__private,但是静态方法不会被子类继承,所以依然执行A中的__private方法,而public为普通方法,可以被B继承,所以会被B中相同的方法名的方法重写;

所以如果我们想要让父类的方法不被子类重写,或者继承,可以将父类的方法定义为私有方法;

延伸:如果想要父类的方法必须被子类重写呢?如何实现?

  1. class A(object):
  2.  
  3. def test(self):
  4. raise NotImplementedError
  5.  
  6. class B(A):
  7.  
  8. def test(self):
  9. print "the method come true"
  10.  
  11. b = B()
  12. b.test()

也就是说,如果子类不实现父类的test()方法,就会触发NotImplementedError错误;

最后总结:前后双下滑线是python语法中class的内置方法;前面双下滑线是表示私有属性或者方法;前面单下划线表示该成员不希望被子类继承/调用,但是实际上是可以被继承或者调用的,这个只是python程序的一般约定,如果有字段或者方法不希望被调用,可以这么搞;

参考:https://my.oschina.net/chinesezhx/blog/729803

http://www.cnblogs.com/hester/articles/4936603.html

python类中方法加单下划线、双下划线、前后双下滑线的区别的更多相关文章

  1. Python 类中方法的内部变量,命名加'self.'变成 self.xxx 和不加直接 xxx 的区别

    先看两个类的方法: >>> class nc(): def __init__(self): self.name ='tester' #name变量加self >>> ...

  2. python 类中方法总结 --- 实例方法、类方法、静态方法

    在python的类语法中,可以出现三种方法,具体如下: (1)实例方法 1)第一个参数必须是实例本身,一般使用[self]表示. 2)在实例方法中,可以通过[self]来操作实例属性,[类名]来操作类 ...

  3. python类中方法__str__()和__repr__()简单粗暴总结

    在交互式模式下,类中同时实现__str__()和__repr__()方法: 直接输入实例名称显示repr返回的类容: 用print打印实例名称显示str返回的内容: >>> clas ...

  4. Python 简明教程 --- 20,Python 类中的属性与方法

    微信公众号:码农充电站pro 个人主页:https://codeshellme.github.io 与客户保持良好的关系可以使生产率加倍. -- Larry Bernstain 目录 类中的变量称为属 ...

  5. 孤荷凌寒自学python第二十四天python类中隐藏的私有方法探秘

    孤荷凌寒自学python第二十四天python类中隐藏的私有方法探秘 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 今天发现了python的类中隐藏着一些特殊的私有方法. 这些私有方法不管我 ...

  6. 第8.6节 Python类中的__new__方法深入剖析:调用父类__new__方法参数的困惑

    上节<第8.5节 Python类中的__new__方法和构造方法__init__关系深入剖析:执行顺序及参数关系案例详解>通过案例详细分析了两个方法的执行顺序,不知大家是否注意到了,在上述 ...

  7. 第8.12节 Python类中使用__dict__定义实例变量和方法

    上节介绍了使用实例的__dict__查看实例的自定义属性,其实还可以直接使用__dict__定义实例变量和实例方法. 一. 使用__dict__定义实例变量 语法: 对象名. dict[属性名] = ...

  8. 第8.34节 《Python类中常用的特殊变量和方法》总结

    本章介绍了Python类中常用的特殊变量和方法,这些特殊变量和方法都有特殊的用途,是Python强大功能的基石之一,许多功能非常有Python特色.由于Python中一切皆对象,理解这些特殊变量和方法 ...

  9. 第8章 Python类中常用的特殊变量和方法目录

    第8章 Python类中常用的特殊变量和方法 第8.1节 Python类的构造方法__init__深入剖析:语法释义 第8.2节 Python类的__init__方法深入剖析:构造方法案例详解 第8. ...

随机推荐

  1. 第31课 老生常谈的两个宏(linux)

    1. Linux内核中常用的两个宏定义 (1)offsetof宏:用于计算TYPE结构体中MEMBER成员的偏移位置 #ifndef offsetof #define offsetof(TYPE, M ...

  2. Linux线程池的实现

    线程池的实现 1:自定义封装的条件变量 //condition.h #ifndef _CONDITION_H_ #define _CONDITION_H_ #include <pthread.h ...

  3. Struts2访问web元素的各种方法

    1.通过RequestAware,SessionAware,ApplicationAware获取: 在Struts2中不能直接访问Request,Session,Application元素,但是可以使 ...

  4. PHP:导出数据到word(包含图片)

    1.方法 public function word() { $xlsModel = M('api_aliucheng'); $Data = $xlsModel->Field('id,u_name ...

  5. elastalert新增自定义警告推送

    举例,博主公司有自己的内部通讯工具(类似QQ),接下来用IM代称该工具.于是希望elastalert的警告推送可以支持IM的公众号群发功能. 等博主这个月知识库写了再来补充hah

  6. Java之ConcurrentHashMap

    由于工作中使用到了ConcurrentHashMap,然后查了一波资料,最后整理如下: 1. 描述: ConcurrentHashMap是在Java1.5作为HashTable的替代选择新引入的,是c ...

  7. 零基础学习python_爬虫(53课)

    1.Url的格式简单介绍,如下图: 2.我们要对网站进行访问,需要用到python中的一个模块或者说一个包吧,urllib(这个在python2中是urllib+urllib2,python3将这两个 ...

  8. (转)处理SQL中的异常并记录错误日志

    原文地址 创建错误日志表: ),ErrState ),ErrLine )) --创建错误日志记录存储过程: CREATE PROCEDURE ErrorLog AS SELECT ERROR_NUMB ...

  9. CentOS 7 救援模式启用网卡及重新获取IP地址

    重新自动获取IP地址命令: dhclient 启用网卡命令 ifconfig ens33 up https://blog.csdn.net/hongmin118/article/details/782 ...

  10. linux获取线程ID

    pthread_self()获取当选线程的ID.这个ID与pthread_create的第一个参数返回的相同.但是与ps命令看到的不同,因此只能用于程序内部,用于对线程进行操作. #include & ...