首先应该明确,在面向对象程序设计中,函数方法这两个概念是有本质区别的。方法一般指与特定实例绑定的函数,通过对象调用方法时,对象本身将被作为第一个参数传递过去,普通函数并不具备这个特点。

>>> class Demo:

pass

>>> t = Demo()

>>> def test(self, v):

self.value = v

>>> t.test = test   #动态增加普通函数

>>> t.test

<function test at 0x00000000034B7EA0>

>>> t.test(t, 3)

>>> print(t.value)

3

>>> import types

>>> t.test = types.MethodType(test, t)     #动态增加绑定的方法

>>> t.test

<bound method test of <__main__.Demo object at 0x000000000074F9E8>>

>>> t.test(5)

>>> print(t.value)

5

Python类的成员方法常用的类型有公有方法私有方法静态方法类方法抽象方法等等。公有方法、私有方法和抽象方法一般是指属于对象的实例方法,私有方法的名字以两个下划线“__”开始,而抽象方法一般定义在抽象类中并且要求派生类必须重新实现。每个对象都有自己的公有方法和私有方法,在这两类方法中都可以访问属于类和对象的成员。公有方法通过对象名直接调用,私有方法不能通过对象名直接调用,只能在其他实例方法中通过前缀self进行调用或在外部通过特殊的形式来调用。另外,Python中的类还支持大量的特殊方法,这些方法的两侧各有两个下划线“__”,往往与某个运算符和内置函数相对应。

所有实例方法(包括公有方法、私有方法、抽象方法和某些特殊方法)都必须至少有一个名为self的参数,并且必须是方法的第一个形参(如果有多个形参的话),self参数代表对象自身。在类的实例方法中访问实例属性时需要以self为前缀,但在外部通过对象名调用对象方法时并不需要传递这个参数。如果在外部通过类名调用属于对象的公有方法,需要显式为该方法的self参数传递一个对象名,用来明确指定访问哪个对象的数据成员。

静态方法类方法都可以通过类名和对象名调用,但不能直接访问属于对象的成员,只能访问属于类的成员。另外,静态方法和类方法不属于任何实例,也不需要绑定到实例,也不依赖与实例的状态,与实例方法相比能够减少很多开销。一般以cls作为类方法的第一个参数表示该类自身,在调用类方法时不需要为该参数传递值,而静态方法则可以不接收任何参数。例如下面的代码所演示:

>>> class Root:

__total = 0

def __init__(self, v):  #构造方法

self.__value = v

Root.__total += 1

def show(self):   #普通实例方法

print('self.__value:', self.__value)

print('Root.__total:', Root.__total)

@classmethod    #修饰器,声明类方法

def classShowTotal(cls):  #类方法,以cls作为第一个参数的名字

print(cls.__total)

@staticmethod  #修饰器,声明静态方法

def staticShowTotal(): #静态方法,可以没有参数

print(Root.__total)

>>> r = Root(3)

>>> r.classShowTotal()  #通过对象来调用类方法

1

>>> r.staticShowTotal()  #通过对象来调用静态方法

1

>>> rr = Root(5)

>>> Root.classShowTotal()  #通过类名调用类方法

2

>>> Root.staticShowTotal()  #通过类名调用静态方法

2

>>> Root.show()  #试图通过类名直接调用实例方法,失败

Traceback (most recent call last):

File "<pyshell#9>", line 1, in <module>

Root.show()

TypeError: unbound method show() must be called with Root instance as first argument (got nothing instead)

>>> Root.show(r)  #可以通过这种方法来调用方法并访问实例成员

self.__value: 3

Root.__total: 2

>>> r.show()

self.__value: 3

Root.__total: 2

抽象方法一般在抽象类中定义,并且要求在派生类中必须重新实现,否则不允许派生类创建实例。

import abc

class Foo(metaclass=abc.ABCMeta):  #抽象类

def f1(self):  #普通实例方法

print(123)

def f2(self):   #普通实例方法

print(456)

@abc.abstractmethod  #抽象方法

def f3(self):

raise Exception('You musr reimplement this method.')

class Bar(Foo):

def f3(self):     #必须重新实现基类中的抽象方法

print(33333)

b = Bar()

b.f3()

明天出差一周,不一定有时间发技术文章,看情况!

详解Python类定义中的各种方法相关推荐

  1. python调用cmd命令释放端口_详解python调用cmd命令三种方法

    目前我使用到的python中执行cmd的方式有三种 使用os.system("cmd") 该方法在调用完shell脚本后,返回一个16位的二进制数,低位为杀死所调用脚本的信号号码, ...

  2. python可以播放音乐吗_详解python播放音频的三种方法

    第一种 使用pygame模块 pygame.mixer.init() pygame.mixer.music.load(self.wav_file) pygame.mixer.music.set_vol ...

  3. pillow属于python标准库吗_详解Python图像处理库Pillow常用使用方法

    PIL(Python Image Library)是python的第三方图像处理库,但是由于其强大的功能与众多的使用人数,几乎已经被认为是python官方图像处理库了. 其官方主页为:PIL. PIL ...

  4. python类装饰器详解-Python类中的装饰器在当前类中的声明与调用详解

    我的Python环境:3.7 在Python类里声明一个装饰器,并在这个类里调用这个装饰器. 代码如下: class Test(): xx = False def __init__(self): pa ...

  5. 详解Python类中的三种方法

    前言 在Python中定义的类,常用的有三种方法(方法其实就是函数),他们分别是实例方法.类方法和静态方法.他们使用于不同的场景,今天就教大家如何区分并在类中正确的使用他们,达到我们需要的效果. 实例 ...

  6. python类定义中__init__()_转:python学习——类中为什么要定义__init__()方法

    学习Python的类,一直不太理解为什么一定要定义init()方法,现在简要谈一下自己的理解吧. 1.不用init()方法定义类 定义一个矩形的类,目的是求周长和面积. 1 classRectangl ...

  7. python类装饰器详解-Python类装饰器实现方法详解

    本文实例讲述了Python类装饰器.分享给大家供大家参考,具体如下: 编写类装饰器 类装饰器类似于函数装饰器的概念,但它应用于类,它们可以用于管理类自身,或者用来拦截实例创建调用以管理实例. 单体类 ...

  8. python 构造函数传参_C++和python混合编程之在python类构造函数中传参方法

    C++和python混合编程 零.前言 一.说明 二.测试代码 1.C++代码 2.python代码 三.运行结果 零.前言 C++是一门高效率的语言,Python是一门简单易学的脚本语言,现在Pyt ...

  9. python学习音频-详解python播放音频的三种方法

    第一种 使用pygame模块 pygame.mixer.init() pygame.mixer.music.load(self.wav_file) pygame.mixer.music.set_vol ...

最新文章

  1. 如何在Linux下安装Docker
  2. 【Android 电量优化】电量优化 ( 耗电量测试 | Battery Historian 简介 | apt 源更新 | Docker 安装 | Battery Historian 安装 )
  3. c语言怎样输出有颜色的迷宫,c语言写的迷宫问题
  4. Marketing Cloud profile界面功能介绍
  5. 线上服务被干爆了,竟然是日志的锅!!
  6. 18kw丹佛斯变频器常见故障_变频器常见故障——输出不平衡、过载、开关电源损坏...
  7. 关于C#语言中的集合
  8. 多线程的关键是,不同线程对象要独立
  9. BLOCK_TYPE_US_VALID(pHead-nBlockUse)
  10. 训练网络时指定gpu显卡
  11. Unity iOS使用ASTC格式纹理实践
  12. 项目配置文件----.eslintignore,eslint在做风格检查的时候忽略 dist 和 vender(第三方库) 不去检查。
  13. 大学生职业生涯规划书性格特征_大学生职业生涯规划书自我分析
  14. Mininet--topo类型-py创建自定义拓扑网络
  15. Nestjs中的守卫
  16. java代码开发类似知网导出_知网语义相似度计算java实现 - 源码下载|其它|中文信息处理|源代码 - 源码中国...
  17. hadoop最新官网如何下载之前版本(2.7.1)
  18. 多智能体仿真环境NetLogo介绍之导入外部数据
  19. 魔兽世界服务器显示负载离线,《WOW》服务器负载过高 官方免费转服
  20. 计算机专业英语名人名言,英语名人名言(中英对照)

热门文章

  1. mysql分组后组内排序_图解排序 3/10 希尔排序
  2. java 图像边界识别_图像识别原理之如何识别图像边缘
  3. 个人计算机网刻系统,全自动网刻后修改计算机配置信息(网管轻松方便)
  4. 基于matlab 的图像重建,基于Matlab的2D-FFT图像重建软件的设计
  5. 集合运算c语言程序设计,C语言运算符的含义集合,~^!|
  6. java 安全发布对象_Java安全的发布对象
  7. 基于JAVA+Servlet+JSP+MYSQL的企业员工投票系统
  8. 基于JAVA+SpringMVC+MYSQL的健身房管理系统
  9. 基于JAVA+SpringMVC+Mybatis+MYSQL的家乡美管理系统
  10. python全栈学习--django基础入门