python 定义method_python进阶14:实例方法和类方法、types.MethodType()

1 实例方法

一个实例的私有属性就是以__开头的属性,无法被外部访问,那这些属性定义有什么用?虽然私有属性无法从外

部访问,但是,从类的内部是可以访问的。除了可以定义实例的属性外,还可以定义实例的方法。实例的方法就是在

类中定义的函数,它的第一个参数永远是 self,指向调用该方法的实例本身,其他参数和一个普通函数是完全一样

的:

class Person(object):

def __init__(self, name):

self.__name = name

def get_name(self):

return self.name

get_name(self) 就是一个实例方法,它的第一个参数是self。__init__(self, name)其实也可看做是一个特殊的

实例方法。调用实例方法必须在实例上调用:

>>> p1 = Person('Bob')

>>> print p1.get_name() #self不需要传入

Bob

在实例方法内部,可以访问所有实例属性,这样,如果外部需要访问私有属性,可以通过方法调用获得,这种数

据封装的形式除了能保护内部数据一致性外,还可以简化外部调用的难度。

2 types.MethodType()

因为方法也是一个属性,所以,它也可以动态地添加到实例上,只是需要用types.MethodType()把一个函数变

为一个方法:

import types

def fn_get_grade(self):

if self.score >= 80:

return 'A'

if self.score >= 60:

return 'B'

return 'C'

class Person(object):

def __init__(self, name, score):

self.name = name

self.score = score

下面我们将fn_get_grade()方法添加到实例上:

>>> p1 = Person('Bob', 90)

>>> p1.get_grade = types.MethodType(fn_get_grade, p1, Person)

>>> print p1.get_grade()

A

>>> p2 = Person('Alice', 65)

>>> print p2.get_grade()

# ERROR: AttributeError: 'Person' object has no attribute 'get_grade'

因p2实例没有绑定get_grade方法,所以出现错误。

3 定义类方法

和属性类似,方法也分实例方法和类方法。

在class中定义的全部是实例方法,实例方法第一个参数 self 是实例本身。定义类方法需要在方法前加上

@classmethod:

class Person(object):

count = 0

@classmethod

def how_many(cls):

return cls.count

def __init__(self, name):

self.name = name

Person.count = Person.count + 1

print Person.how_many()

p1 = Person('Bob')

print Person.how_many()

通过标记一个 @classmethod,该方法将绑定到 Person 类上,而非类的实例。类方法的第一个参数将传入类本

身,通常将参数名命名为 cls,上面的 cls.count 实际上相当于 Person.count。因为是在类上调用,而非实例上调

用,因此类方法无法获得任何实例变量,只能获得类的引用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/265537.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

#ifndef, #define, #endif的作用

目录作用示例作用 #ifndef 它是if not define 的简写,是宏定义的一种,实际上确切的说,这应该是预处理功能三种(宏定义、文件包含、条件编译)中的一种——条件编译。 在c语言中,对同一个变量或者函数进行…

CQRS架构

参考:https://www.cnblogs.com/shijingxiang/articles/5465495.html http://www.cnblogs.com/netfocus/p/4055346.html转载于:https://www.cnblogs.com/lshan/p/9910514.html

高性能的MySQL(2)慢查询

一、剖析MySQL查询1、首先从慢查询开始,慢查询是开销最低,精度最高的测量查询时间的工具。a、开始mysql的慢查询,修改my.conf[mysqld] #开启慢查询 log_slow_queries ON #指定日志文件存放位置,可以为空,系统会给一个…

python爬虫获取小说根据正文调用函数传入章节地址列表_python爬虫之小说章节获取,聊斋志异小说完整版...

“写鬼写妖高人一等,刺贪刺虐入骨三分。”没找到聊斋志异完整版的txt文档,那就把在线阅读的文章抓下来吧。开发环境python3.7requests模块lxml模块获取分析找到聊斋志异的小说网站。通过查看源码与分析小说每一章的URL链接发现,构成每一章的U…

程序运行时对应的内存分布(BSS段、数据段、代码段、堆、栈)关系

参考:程序运行时对应的内存分布关系 作者:嵌入式基地(公众号) 发布时间: 2021-04-28 网址:https://mp.weixin.qq.com/s/AVDPZawSjg9HtxEm8vsFBA 参考:静态变量与动态变量的定义与区别 作者&…

JS数字转中文

function number2Chinese(n) {if (!/^(0|[1-9]\d*)(\.\d)?$/.test(n)) return 数据非法;let unit 京亿万仟佰拾兆万仟佰拾亿仟佰拾万仟佰拾元角分,str ;n 00;let p n.indexOf(.);if (p > 0) n n.substring(0, p) n.substr(p 1, 2);unit unit.substr(unit.length - …

“捆绑”住用户,需要优秀的产品(经验分享)

捆绑,是一种野蛮的方式。若是主动的去被捆绑,意义反差就大了。用户容易被新奇的东西所吸引,会主动的去了解。若是符合自身需求性,会甘愿的成为其中的一员。这样的现象,是被捆绑体现。正如周鸿祎所言,做出好…

java线程池 锁_java多线程——锁

这是多线程系列第四篇,其他请关注以下:如果你看过前面几篇关于线程的文字,会对线程的实现原理了然于胸,有了理论的支持会对实践有更好的指导,那么本篇会偏重于线程的实践,对线程的几种应用做个简要的介绍。…

Ubuntu时间显示不准确的解决方案

参考:解决ubuntu里面时间不正确的办法 作者:三速何时sub20 发布时间:2020-12-08 16:24:27 网址:https://blog.csdn.net/weixin_44234294/article/details/110875899?spm1001.2014.3001.5501 目录1、进入终端2、输入命令3、选择 A…

【洛谷P2680】运输计划

题目链接 题目大意: 一棵\(n\)个点的带边权的数,给定\(m\)条树上两点间的路径,现在你可以让树上任意一条边的权值变为零, 问如何选边使得\(m\)条路径中边权和最大的路径的边权和最小 \(\mathcal{solution}\) 这是\(NOIP2015\)的\(…

Ubuntu下软件的安装、卸载方法

参考:Ubuntu 如何使用命令卸载安装过的软件(超级简单) 作者:一只青木呀 发布时间:2020-08-04 09:19:01 网址:https://blog.csdn.net/weixin_45309916/article/details/107778981 参考:Ubuntu下软…

webservice系统学习笔记9-使用契约优先的方式的一个服务端demo(隐式传Header信息)...

服务器端&#xff1a; 1、编写wsdl文件 <?xml version"1.0" encoding"UTF-8" standalone"no"?> <wsdl:definitions xmlns:soap"http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns"http://www.example.org/mywsdl/&qu…

java gzip 多个文件_Java Zip多文件压缩和 GZIP压缩

/*** 多文件压缩** author Administrator**/public class ZipCompress {public static void main(String args[]) {String[] filepaths { "D:\\zip1.txt", "D:\\zip2.txt" };try {FileOutputStream f new FileOutputStream("D://test.zip");//…

Ubuntu文件压缩、解压缩、打包解包(带软链接)、拷贝文件(带软链接)、拷贝文件夹

参考&#xff1a;Ubuntu 命令解压文件大全 作者&#xff1a;一只青木呀 发布时间&#xff1a; 2020-08-04 17:18:55 网址&#xff1a;https://blog.csdn.net/weixin_45309916/article/details/107791294 参考&#xff1a;打包和压缩的概念和区别 作者&#xff1a;不浪漫的罪名L…

java 内存和实际内存_请问更改eclipse内存和更改jvm内存是一会事儿吗?

RSS列 表示&#xff0c; 程序占用了多少物理内存。 虚拟内存可以不用考虑&#xff0c;它并不占用实际物理内存。 (2). top 命令也可以 其中VIRT(或VSS)列 表示&#xff0c;程序占用了多少虚拟内存。 同 ps aux 中的 VSZ列 RES列 表示&#xff0c; 程序占用了多少物理内存。同 p…

thinkphp 编辑器kindeditor

首先&#xff0c;去官网下载最新版的kindeditor&#xff0c;然后把里面asp&#xff0c;jsp&#xff0c;net&#xff0c;example的全删除&#xff0c;然后改名为editor放进public&#xff08;最外层目录的public&#xff09;文件夹里面 在目录lib目录建立ORG文件夹&#xff08;个…

equation

equation 题目描述 有一棵n 个点的以 1 为根的树, 以及 n 个整数变量xi。树上 i 的父亲是 fi&#xff0c; 每条边(i,fi)有一个权值wi&#xff0c;表示一个方程 xi xfi wi&#xff0c;这 n-1个方程构成了一个方程组。 现在给出q 个操作&#xff0c;有两种类型: 1 u v s&#x…

Ubuntu开启FTP服务方法(Ubuntu和Windows之间互传文件需要开启——服务器端)

目录Ubuntu开启FTP服务步骤&#xff1a;Ubuntu开启FTP服务步骤&#xff1a; 工作中Ubuntu和Windows之间互传文件&#xff0c;需要服务器端&#xff08;Ubuntu&#xff09;开启FTP服务&#xff0c;客户端&#xff08;Windows&#xff09;安装FileZilla。平时自己学习电脑安装虚拟…

舞伴配对问题java_舞伴配对问题

循环队列的应用——舞伴配对问题&#xff1a;在舞会上&#xff0c;男、女各自排成一队。舞会开始时&#xff0c;依次从男队和女队的队头各出一人配成舞伴。如果两队初始人数不等&#xff0c;则较长的那一队中未配对者等待下一轮舞曲。假设初始男、女人数及性别已经固定&#xf…

逆元

复习逆元…… 逆元 求法&#xff1a; 1&#xff0c;快速幂     根据费马小定理有\(a^{p - 1} \equiv 1 \quad (mod \quad p)\),把左边拆开一下得到     \[a \cdot a^{p - 2} \equiv 1 \quad (mod \quad p)\]     因此\(a^{p - 2}\)为\(a\)在\(mod \quad p\)意义下的…