1、我们已经讨论了类/对象可以拥有像函数一样的方法,这些对象方法与函数的区别只是一个额外的self变量

# -*- coding:utf-8 -*-

#!/usr/bin/python

# Filename: method.py

class Person:

grade=1

def __init__(self,name):

self.name = name

def sayHi(self):    #加self区别于普通函数

print 'Hello, your name is?',self.name

@staticmethod     #静态方法不能访问类变量和实例变量,也不能使用self

def sayName():

print "my name is king"

@classmethod     #类方法可以访问类变量,但不能访问实例变量

def classMethod(cls):

print("class method")

p = Person("king")

p.sayHi()

p.sayName()

p.classMethod()

Person.classMethod()

输出:

Hello, your name is? king

my name is king

class method

class method

2、静态方法

要在类中使用静态方法,需在类成员函数前面加上@staticmethod标记符,以表示下面的成员函数是静态函数。使用静态方法的好处是,不需要定义实例即可使用这个方法。另外,多个实例共享此静态方法。

3、 类方法

类方法与普通的成员函数和静态函数有不同之处,在接触的语言中好像也没见过这种语义,看它的定义:

一个类方法就可以通过类或它的实例来调用的方法, 不管你是用类来调用这个方法还是类实例调用这个方法,该方法的第一个参数总是定义该方法的类对象。

记住:方法的第一个参数都是类对象而不是实例对象.

按照惯例,类方法的第一个形参被命名为 cls.任何时候定义类方法都不是必须的(类方法能实现的功能都可以通过定义一个普通函数来实现,只要这个函数接受一个类对象做为参数就可以了).

python中实现静态方法和类方法都是依赖于python的修饰器来实现的。 对象方法有self参数,类方法有cls参数,静态方法不需要这些附加参数。

class MyClass:

val1 = 'Value 1'   #这里的val1是实例变量

def __init__(self):

self.val2 = 'Value 2'    #这里的val2是实例变量

@staticmethod

def staticmd():

print '静态方法,无法访问实例变量val1和实例变量val2'

@classmethod

def classmd(cls):

print '类方法,类:' + str(cls) + ',val1:' + cls.val1 + ',无法访问val2的值'    #这里的cls.val1是类变量

分析如下:

>>> mc = MyClass()  # 实例化

>>> mc.staticmd()  # 实例调用静态方法,无法访问实例变量val1和val2

>>>

静态方法,无法访问val1和val2

>>> mc.classmd()  # 实例调用类方法,注意,这里访问的是类MyClass的变量val1的值,不是实例化后mc的实例变量val1,这里容易混淆,往下看就会明白。val2一直是实例变量,所以无法访问

>>>

类方法,类:__main__.MyClass,val1:Value 1,无法访问val2的值

>>> MyClass.staticmd()  # 类直接调用静态方法,结果同上面的实例调用,无论是类变量还是实例变量都无法访问

>>>

静态方法,无法访问val1和val2

>>> MyClass.classmd()  # 类直接调用类方法,结果同上面的实例调用

>>>

类方法,类:__main__.MyClass,val1:Value 1,无法访问val2的值

>>> mc.val1 = 'Value changed'  # 改变实例变量val1的值

>>> mc.classmd()  # 实例调用类方法,注意到cls.val1的值没变,所以,这时的cls.val1是类变量val1,而非实例变量val1

>>>

类方法,类:__main__.MyClass,val1:Value 1,无法访问val2的值

>>> MyClass.classmd()  # 类直接调用类方法,结果同上面的实例调用

>>>

类方法,类:__main__.MyClass,val1:Value 1,无法访问val2的值

>>> MyClass.val1 = 'Class Value changed'  # 改变类变量val1的值

>>> mc.classmd()  # 实例调用类方法,注意到cls.val1的值变了,所以,进一步证明了这时的cls.val1是类变量val1,而非实例变量val1

>>>

类方法,类:__main__.MyClass,val1:Class Value changed,无法访问val2的值

>>> MyClass.classmd()  # 类直接调用类方法,结果同上面的实例调用

>>>

类方法,类:__main__.MyClass,val1:Class Value changed,无法访问val2的值

结论

如果上述执行过程太复杂,记住以下两点就好了:

静态方法:无法访问类属性、实例属性,相当于一个相对独立的方法,跟类其实没什么关系,换个角度来讲,其实就是放在一个类的作用域里的函数而已。

类成员方法:可以访问类属性,无法访问实例属性。上述的变量val1,在类里是类变量,在实例中又是实例变量,所以容易混淆。

python对象点方法_python对象方法、类方法、静态方法相关推荐

  1. Python利用JPype调用Java对象方法【实现在Python中调用JAVA】

    一.JPype简述 1.JPype是什么? JPype是一个能够让 python 代码方便地调用 Java 代码的工具,从而克服了 python 在某些领域(如服务器端编程)中的不足. 2.JPype ...

  2. 常用js的数组方法和对象方法

    js常用的数组方法和对象方法 常用js的数组方法和对象方法 数组的方法 对象的方法 常用js的数组方法和对象方法 从此以后也要写博客辣,用来记录常见的问题和碰到的新问题.最近记忆力越来越差了. 数组的 ...

  3. python类中方法调用自己类的方法_python怎么调用类方法

    python中的类用来描述具有相同的属性和方法的对象的集合.它定义了该集合中每个对象所共有的属性和方法.对象是类的实例. 要想调用类中的方法,首先要定义一个类,python中定义类使用class关键字 ...

  4. 下列不是python数据类型的是_Python数据类型方法精心整理,不必死记硬背,看看源码一切都有了...

    Python认为一切皆为对象:比如我们初始化一个list时: li = list('abc') 实际上是实例化了内置模块builtins(python2中为__builtin__模块)中的list类: ...

  5. python展开面_python面度对象(属性,类方法,静态方法)

    一. 属性 所谓的属性,就是将一个类中的方法伪装成一个属性.在代码的级别是没有任何本质上的提升.但是让代码看起来更顺眼. property 装饰器函数,内置函数,帮助你将类中的方法伪装成属性(特性). ...

  6. python方法调用方法_Python之方法调用

    Python中类的方法有两种形式: 1.绑定方法和非绑定方法 绑定的概念主要与方法调用相关联,方法是类内部定义的函数(这意味着方法是类属性而不是实例属性),方法只有在其所属的类拥有实例时,才能被调用, ...

  7. python的对象和方法_python--类方法、对象方法、静态方法

    python中实现静态方法和类方法都是依赖于python的修饰器来实现的. 对象方法有self参数,类方法有cls参数,静态方法是不需要这些附加参数的. 1.我们已经讨论了类/对象可以拥有像函数一样的 ...

  8. python构造和析构_python魔法方法 构造和析构实例讲解

    目录: 一._ _init_ _(self[, ...]) 二._ _new_ _(cls[, ...]) 三._ _del_ _(self) 四.课时41课后习题及答案 说的那么厉害,那什么是魔法方 ...

  9. python __reduce__魔法方法_Python魔法方法指南

    (译)Python魔法方法指南 简介 本指南归纳于我的几个月的博客,主题是 魔法方法 . 什么是魔法方法呢?它们在面向对象的Python的处处皆是.它们是一些可以让你对类添加"魔法" ...

最新文章

  1. 互补性:从不同的角度思考同一个事物时,发现它同时具有不同甚至相互矛盾的性质...
  2. 连接池--在密码修改的影响
  3. 一个母婴电子商务网站贝贝网的大数据平台及机器学习实践【转】
  4. opencv镜像_DX200操作要领—PAM与镜像平移变换(三十八)
  5. 大型油烟机清洗机器人_高利洁大型油烟机清洗设备简介
  6. halcon gen_region_hline 绘制霍夫变换提取直线
  7. 报错The sandbox is not in sync with the Podfile.lock
  8. ios 开发日记 21 -自动处理键盘事件的第三方库:IQKeyboardManager
  9. mybatis 鉴别其_Mybatis学习笔记9 - 鉴别器discriminator
  10. 滴普科技,全场景数据智能服务商
  11. centos7 sh 注释_在CentOS7上安装RocketMQ 4.7.1
  12. 树莓派+android things+实时音视频传输demo之遥控小车
  13. Linux Interrupt——魅族内核大神文章
  14. 静态代码编码安全审计: PHP源代码审计工具RIPS
  15. bilibili弹幕爬虫, 2019-1-10
  16. BJT转UTC世界协调时
  17. zookeeper leader和learner的数据同步
  18. CorelDRAW x4提示非法软件产品被禁用解决方法教程
  19. 初识Docker:(5)Docker自定义镜像
  20. MySQL无法成功安装,如何将MySQL卸载干净

热门文章

  1. python编程基础(四):编程习惯、代码规范、易混淆之处
  2. python 笔记:爱因斯坦求和 einsum
  3. 数据挖掘之关联算法Apriori
  4. python答案公众号_大学慕课用Python玩转数据答案查题公众号
  5. LeetCode-剑指 Offer 25. 合并两个排序的链表
  6. 如何求解问题--数据结构与算法入门
  7. 解构电商产品——订单系统(一)
  8. 6-tips-for-managing-property-files-with-spring--转
  9. Lesson 12.4 逻辑回归建模实验
  10. dreamweaver中的JSP的编程环境配置