Python的程序结构[1] -> 方法/Method[0] -> 类实例方法、私有方法和抽象方法
类实例方法、私有方法和抽象方法
Python中最常用的就是类实例方法,类似于属性中的类实例属性,同时,也存在与私有属性类似方法,即私有方法,下面介绍这两种常见的方法,以及一种特殊意义的类实例方法 -- 抽象方法。
类实例方法 / Instance Method
类实例方法通过关键字 def 进行定义,第一个参数默认为 self,可利用 self / 类实例 对方法进行调用,是最基本的一种方法
class Foo(object):
def foo(self):
print("This is foo method.") f = Foo()
f.foo()
上面的代码中定义了一个 Foo 类,然后定义了一个类实例的方法 foo,在第 5 行中,通过类生成了一个类实例 f ,然后利用 f.foo() 实现对类实例方法的调用 (除了这种方式外,还可以通过 getattr / __getattribute__ 等方式来获取这个 foo 方法)。
最终可以看到,console 中输出了 foo 方法所 print 的内容
This is foo method.
私有方法 / Private Method
Python中没有类似其他语言的 public, private 等关键词进行修饰。在 Python 中定义私有方法与私有属性类似,只需要在方法的前面加上 ‘__’ 两个下划线。在内部,Python 使用一种 name mangling 技术,将 __membername 替换成 _classname__membername,所以你在外部使用原来的私有成员的名字时,会提示找不到。
Note: 此处的 __membername 不可写成 __membername__,否则将不是私有方法而变成魔术方法。
class Foo():
def __privatemethod(self):
print('This is a private method.') def _privatemethod_callable(self):
print('This is a private method but callable.') f = Foo()
f._Foo__privatemethod()
f._privatemethod_callable()
与前面类似,在类中定义了两个私有方法,这里与私有属性相同,单下划线代表声明是一个内部的私有方法,但是依旧可以从外部进行调用,而双下划线则说明这是一个收保护的私有方法。定义完成后生成一个类的实例,并对私有方法进行调用,从调用的方式可以看出, name mangling 所起到的作用。
This is a private method.
This is a private method but callable.
抽象方法 / Abstract Method
Python中的抽象方法是一种定义于基类的方法,任何继承该基类的方法都需要重新定义该方法。最简单的抽象方法定义方式如下:
class Foo():
def abmethod(self):
raise NotImplementedError
但是这种方法的弊端在于只有当调用的时候才能检测子类是否重定义了该方法,为此 Python 提供了一个 abc 模块,使得抽象方法在初始化阶段就可以检测是否重定义(参考abc模块部分)。该方法通过@abstractmethod进行装饰。
相关阅读
1. abc 模块
Python的程序结构[1] -> 方法/Method[0] -> 类实例方法、私有方法和抽象方法的更多相关文章
- Python的程序结构[4] -> 函数/Function[0] -> 函数与方法的区别
函数与方法的区别 / Distinction of Function and Method 关于函数与方法的区别,可根据两者的定义看出, 函数function -- A series of state ...
- Python的程序结构[5] -> 模块/Module[0] -> 内建模块 builtins
builtins 内建模块 / builtins Module 在Python的模块中,有一种特殊模块,无需导入便可以使用,其中包含了许多内建函数与类. builtins 模块内容 / builtin ...
- Python的程序结构[3] -> 变量/Variable[0] -> 变量类型
变量类型 / Variable Type 在 Python 中,变量主要有以下几种,即全局变量,局部变量和内建变量, 全局变量 / Global Variable 通常定义于模块内部,大写变量名形式存 ...
- Python的Django框架中forms表单类的使用方法详解
用户表单是Web端的一项基本功能,大而全的Django框架中自然带有现成的基础form对象,本文就Python的Django框架中forms表单类的使用方法详解. Form表单的功能 自动生成HTML ...
- 【转】【Java】利用反射技术,实现对类的私有方法、变量访问
java关于反射机制的包主要在java.lang.reflect中,structs,hibernate,spring等框架都是基于java的反射机制. 下面是一个关于利用java的反射机制,实现了对私 ...
- Java字符串的匹配问题,String类的matches方法与Matcher类的matches方法的使用比较,Matcher类的matches()、find()和lookingAt()方法的使用比较
参考网上相关blog,对Java字符串的匹配问题进行了简单的比较和总结,主要对String类的matches方法与Matcher类的matches方法进行了比较. 对Matcher类的matches( ...
- 无所不能的PowerMock,mock私有方法,静态方法,测试私有方法,final类
1.为什么要用mock 我的一本书的解释: (1)创建所需的DB数据可能需要很长时间,如:调用别的接口,模拟很多数据 (2)调用第三方API接口,测试很慢, (3)编写满足所有外部依赖的测试可能很复杂 ...
- 在C#中我们能调用一个类的私有方法吗
博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:在C#中我们能调用一个类的私有方法吗.
- Python的程序结构[1] -> 方法/Method[1] -> 静态方法、类方法和属性方法
静态方法.类方法和属性方法 在 Python 中有三种常用的方法装饰器,可以使普通的类实例方法变成带有特殊功能的方法,分别是静态方法.类方法和属性方法. 静态方法 / Static Method 在 ...
随机推荐
- 为什么要搞vim
一. 先得想清楚折腾vim受的这顿折磨值不值.值.零碎记录几点. 迫使我使用vim的原因如下: (1)之前实习的公司的开发机上只有vim,以后工作的公司也只有vim,同部门的同事大都用vim:如果不用 ...
- jmeter学习(二),如何安装jmeter?
官网地址:http://jmeter.apache.org/download_jmeter.cgi 如下图数字3.2表示的是版本号,jmeter是基于java的压力测试工具.所以运行环境一定要满足最低 ...
- selenium获取浏览器控制台日志
public void logsTest(){ WebDriver driver = null; try { System.setProperty("webdriver.chrome.dri ...
- Wordpress 后台文章编辑区添加模板选择功能
功能:后台编辑文章时,可以选择文章使用的模板,效果如下图: 操作步骤: <?php /** * Template Name: kbsingle full * Add by Ryan 3/18/2 ...
- 第1张 Maven简介 学习笔记
什么是构建? 编译.运行单元测试.生成文档.打包和部署 Maven的应用: 构建工具 依赖管理工具 通过坐标系统定位到每一个构建(artifact) 项目信息管理工具 Maven对于项目目录结构.测试 ...
- 【bzoj4001】[TJOI2015]概率论 生成函数+导数
题目描述 输入 输入一个正整数N,代表有根树的结点数 输出 输出这棵树期望的叶子节点数.要求误差小于1e-9 样例输入 1 样例输出 1.000000000 题解 生成函数+导数 先考虑节点个数为$n ...
- SICAU-OJ: 数字游戏
数字游戏 题意:给出一个长度为n的数字,然后抹去k个数,使得剩下的数最大. 题解: 贪心的思想:让答案串中每一位尽可能大. 我们肯定要用完这k次的,假设有一个答案字符串ans,我们现在遍历给出的串,假 ...
- 使用 redux 监听插件的使用
首先需要在chrome浏览器当中下载redux插件 接着在你的项目当中加上**window.__REDUX_DEVTOOLS_EXTENSION__ && window.__REDUX ...
- 汕头市队赛 SRM1X T2 ——扫描线
绵津见-终 SRM 13 背景 “西瓜也是可以种在海上的!”——绵津见 然而种在海上的西瓜最需要防范的,是时不时会涌向瓜田的阵阵海浪. 幸好,身为海神的绵津见可以释放魔法“水平如镜”来阻止海浪拍打西瓜 ...
- 汕头市队赛 SRM 07 C 整洁的麻将桌
C 整洁的麻将桌 SRM 07 背景&&描述 天才麻将少女KPM立志要在日麻界闯出一番名堂. KPM上周双打了n场麻将,但她这次没控分,而且因为是全民参与的麻将大赛,所以她的名 ...