python类中方法加单下划线、双下划线、前后双下滑线的区别
首先看一段代码:
class Foo():
def __init__(self):
print "__init__ method" def public_method(self):
print "public_method" def __private_method(self):
print "__private_method" def _halfprivate_method(self):
print "_halfprivate_method"
这里我们定义了一个类Foo,类成员函数有双下划线方法__private_method和单下滑线方法_halfprivate_method,调用public_method和_halfprivate_method结果如下:
f = Foo()
f.public_method()
f._halfprivate_method() 结果:
__init__ method
public_method
_halfprivate_method
显示没有问题。调用__private_method结果如下:
f = Foo()
f.__private_method() 结果:
Traceback (most recent call last):
__init__ method
File "C:/Python_Data_Analyse1/python下划线的意义.py", line 19, in <module>
f.__private_method()
AttributeError: Foo instance has no attribute '__private_method'
结果显示Foo的实例化的对象没有属性__private_method,但是如果使用_类__object的方式,就可以访问私有方法了,如下:
f = Foo()
f._Foo__private_method()
结论:python 的类实例化的对象可以调用单下划线开头的方法,不能调用双下划线的方法;
再看一段代码:
class A(object):
def __init__(self):
self.__private()
self.public() def __private(self):
print 'A.__private()' def public(self):
print 'A.public()' class B(A):
def __private(self):
print 'B.__private()' def public(self):
print 'B.public()'
b = B()
显示结果为:
__init__ method
A.__private()
B.public()
实例化子类B就会执行__init__方法,调用静态方法__private,但是静态方法不会被子类继承,所以依然执行A中的__private方法,而public为普通方法,可以被B继承,所以会被B中相同的方法名的方法重写;
所以如果我们想要让父类的方法不被子类重写,或者继承,可以将父类的方法定义为私有方法;
延伸:如果想要父类的方法必须被子类重写呢?如何实现?
class A(object):
def test(self):
raise NotImplementedError
class B(A):
def test(self):
print "the method come true"
b = B()
b.test()
也就是说,如果子类不实现父类的test()方法,就会触发NotImplementedError错误;
最后总结:前后双下滑线是python语法中class的内置方法;前面双下滑线是表示私有属性或者方法;前面单下划线表示该成员不希望被子类继承/调用,但是实际上是可以被继承或者调用的,这个只是python程序的一般约定,如果有字段或者方法不希望被调用,可以这么搞;
参考:https://my.oschina.net/chinesezhx/blog/729803
http://www.cnblogs.com/hester/articles/4936603.html
python类中方法加单下划线、双下划线、前后双下滑线的区别的更多相关文章
- Python 类中方法的内部变量,命名加'self.'变成 self.xxx 和不加直接 xxx 的区别
先看两个类的方法: >>> class nc(): def __init__(self): self.name ='tester' #name变量加self >>> ...
- python 类中方法总结 --- 实例方法、类方法、静态方法
在python的类语法中,可以出现三种方法,具体如下: (1)实例方法 1)第一个参数必须是实例本身,一般使用[self]表示. 2)在实例方法中,可以通过[self]来操作实例属性,[类名]来操作类 ...
- python类中方法__str__()和__repr__()简单粗暴总结
在交互式模式下,类中同时实现__str__()和__repr__()方法: 直接输入实例名称显示repr返回的类容: 用print打印实例名称显示str返回的内容: >>> clas ...
- Python 简明教程 --- 20,Python 类中的属性与方法
微信公众号:码农充电站pro 个人主页:https://codeshellme.github.io 与客户保持良好的关系可以使生产率加倍. -- Larry Bernstain 目录 类中的变量称为属 ...
- 孤荷凌寒自学python第二十四天python类中隐藏的私有方法探秘
孤荷凌寒自学python第二十四天python类中隐藏的私有方法探秘 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 今天发现了python的类中隐藏着一些特殊的私有方法. 这些私有方法不管我 ...
- 第8.6节 Python类中的__new__方法深入剖析:调用父类__new__方法参数的困惑
上节<第8.5节 Python类中的__new__方法和构造方法__init__关系深入剖析:执行顺序及参数关系案例详解>通过案例详细分析了两个方法的执行顺序,不知大家是否注意到了,在上述 ...
- 第8.12节 Python类中使用__dict__定义实例变量和方法
上节介绍了使用实例的__dict__查看实例的自定义属性,其实还可以直接使用__dict__定义实例变量和实例方法. 一. 使用__dict__定义实例变量 语法: 对象名. dict[属性名] = ...
- 第8.34节 《Python类中常用的特殊变量和方法》总结
本章介绍了Python类中常用的特殊变量和方法,这些特殊变量和方法都有特殊的用途,是Python强大功能的基石之一,许多功能非常有Python特色.由于Python中一切皆对象,理解这些特殊变量和方法 ...
- 第8章 Python类中常用的特殊变量和方法目录
第8章 Python类中常用的特殊变量和方法 第8.1节 Python类的构造方法__init__深入剖析:语法释义 第8.2节 Python类的__init__方法深入剖析:构造方法案例详解 第8. ...
随机推荐
- ZooKeeper系列(6):ZooKeeper机制架构
一.ZooKeeper权限管理机制 1.1 权限管理ACL(Access Control List) ZooKeeper 的权限管理亦即ACL 控制功能,使用ACL来对Znode进行访问控制.ACL的 ...
- (转)C#实现注册码
原文地址:http://www.cnblogs.com/netcorner/archive/2011/08/31/2911922.html 开发软件时,当用到商业用途时,注册码与激活码就显得很重要了. ...
- 使用Solrj 获取语句分词结果的代码
import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.apache.log4 ...
- 转)mybatis实战教程(mybatis in action),mybatis入门到精通
mybatis实战教程(mybatis in action),mybatis入门到精通 http://limingnihao.iteye.com/blog/781671 http://blog.csd ...
- jsfiddle修改个人头像
找了半天终于知道修改jsfiddle头像的方法了~ JsFiddle将Gravatar - 全球认可的头像用于个人资料图片.必须在这里改变你的头像,它也会在jsFiddle中自动更新. 注意,两者的注 ...
- 小数据池 id
1. 小数据池, id() 小数据池针对的是: int, str, bool 在py文件中几乎所有的字符串都会缓存. id() 查看变量的内存地址 # id()函数可以帮我们查看一个变量的内存地址 # ...
- js数据类型转换 ----流程控制
数据类型转换: //number转换成str // var str=a+''; // console.log(str); // console.log(typeof str); //转换成字符串了 v ...
- CentOS7上安装RabbitMQ
1.首先需要安装erlang RabbitMq依赖于erlang,所以得先装这个.推荐使用阿里云的镜像资源. 通过这个链接 https://opsx.alibaba.com/mirror/search ...
- webform之Repeater控件
一.Repeater控件 数据循环编辑 1.repeater包括五大模板: (1)HeaderTemplate:标题模板,对开头进行编辑,只执行一次 (2)FooterTemplate:页尾结束模板, ...
- leetcode1008
class Solution: def __init__(self): self.root = None def construct(self,order,root,i): if i==len(ord ...