python对象点方法_python对象方法、类方法、静态方法
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对象方法、类方法、静态方法相关推荐
- Python利用JPype调用Java对象方法【实现在Python中调用JAVA】
一.JPype简述 1.JPype是什么? JPype是一个能够让 python 代码方便地调用 Java 代码的工具,从而克服了 python 在某些领域(如服务器端编程)中的不足. 2.JPype ...
- 常用js的数组方法和对象方法
js常用的数组方法和对象方法 常用js的数组方法和对象方法 数组的方法 对象的方法 常用js的数组方法和对象方法 从此以后也要写博客辣,用来记录常见的问题和碰到的新问题.最近记忆力越来越差了. 数组的 ...
- python类中方法调用自己类的方法_python怎么调用类方法
python中的类用来描述具有相同的属性和方法的对象的集合.它定义了该集合中每个对象所共有的属性和方法.对象是类的实例. 要想调用类中的方法,首先要定义一个类,python中定义类使用class关键字 ...
- 下列不是python数据类型的是_Python数据类型方法精心整理,不必死记硬背,看看源码一切都有了...
Python认为一切皆为对象:比如我们初始化一个list时: li = list('abc') 实际上是实例化了内置模块builtins(python2中为__builtin__模块)中的list类: ...
- python展开面_python面度对象(属性,类方法,静态方法)
一. 属性 所谓的属性,就是将一个类中的方法伪装成一个属性.在代码的级别是没有任何本质上的提升.但是让代码看起来更顺眼. property 装饰器函数,内置函数,帮助你将类中的方法伪装成属性(特性). ...
- python方法调用方法_Python之方法调用
Python中类的方法有两种形式: 1.绑定方法和非绑定方法 绑定的概念主要与方法调用相关联,方法是类内部定义的函数(这意味着方法是类属性而不是实例属性),方法只有在其所属的类拥有实例时,才能被调用, ...
- python的对象和方法_python--类方法、对象方法、静态方法
python中实现静态方法和类方法都是依赖于python的修饰器来实现的. 对象方法有self参数,类方法有cls参数,静态方法是不需要这些附加参数的. 1.我们已经讨论了类/对象可以拥有像函数一样的 ...
- python构造和析构_python魔法方法 构造和析构实例讲解
目录: 一._ _init_ _(self[, ...]) 二._ _new_ _(cls[, ...]) 三._ _del_ _(self) 四.课时41课后习题及答案 说的那么厉害,那什么是魔法方 ...
- python __reduce__魔法方法_Python魔法方法指南
(译)Python魔法方法指南 简介 本指南归纳于我的几个月的博客,主题是 魔法方法 . 什么是魔法方法呢?它们在面向对象的Python的处处皆是.它们是一些可以让你对类添加"魔法" ...
最新文章
- 互补性:从不同的角度思考同一个事物时,发现它同时具有不同甚至相互矛盾的性质...
- 连接池--在密码修改的影响
- 一个母婴电子商务网站贝贝网的大数据平台及机器学习实践【转】
- opencv镜像_DX200操作要领—PAM与镜像平移变换(三十八)
- 大型油烟机清洗机器人_高利洁大型油烟机清洗设备简介
- halcon gen_region_hline 绘制霍夫变换提取直线
- 报错The sandbox is not in sync with the Podfile.lock
- ios 开发日记 21 -自动处理键盘事件的第三方库:IQKeyboardManager
- mybatis 鉴别其_Mybatis学习笔记9 - 鉴别器discriminator
- 滴普科技,全场景数据智能服务商
- centos7 sh 注释_在CentOS7上安装RocketMQ 4.7.1
- 树莓派+android things+实时音视频传输demo之遥控小车
- Linux Interrupt——魅族内核大神文章
- 静态代码编码安全审计: PHP源代码审计工具RIPS
- bilibili弹幕爬虫, 2019-1-10
- BJT转UTC世界协调时
- zookeeper leader和learner的数据同步
- CorelDRAW x4提示非法软件产品被禁用解决方法教程
- 初识Docker:(5)Docker自定义镜像
- MySQL无法成功安装,如何将MySQL卸载干净