解析python 类方法、对象方法、静态方法


Posted in Python onAugust 15, 2020

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

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 #声明静态,去掉则编译报错;还有静态方法不能访问类变量和实例变量
def sayName():#使用了静态方法,则不能再使用self
print "my name is king"#,grade,#self.name

@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标记符,以表示下面的成员函数是静态函数。使用静态方法的好处是,不需要定义实例即可使用这个方法。另外,多个实例共享此静态方法。

静态方法是一类特殊的方法,有时可能需要写一个属于这个类的方法,但是这些代码完全不会使用到实例对象本身,例如:

class Student(object):
 @staticmethod
 def aver_age(x, y):
  return x + y

 def year(self):
  return self.aver_age(self.month, self.day)

这个例子中,如果把aver_age作为非静态方法同样可以运行,但是它要提供self参数,而这个参数在方法中根本不会被使用到。这里的@staticmethod装饰器可以给我们带来一些好处,Python不再需要为Student对象实例初始化一个绑定方法,绑定方法同样是对象,但是创建需要成本,而静态方法可以避免这些。

Student().year is Student().year
Student().aver_age is Student().aver_age
Student().aver_age is Student.aver_age
False
True
True

可读性更好的代码,看到@staticmethod我们就知道这个方法并不需要依赖对象本身的状态。
可以在子类中被覆盖,如果是把aver_age作为模块的顶层函数,那么继承自Student的子类就没法改变Student的aver_age了如果不覆盖year的话。

3、 类方法

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

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

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

class Dog(object):
 food = "gutou"
 age = "1"
 def __init__(self, name):
  self.NAME = name
 @classmethod
 def eat(self,age): #只能是类中的变量
  # print(self.NAME)
  print(age)
  print(self.food)

 @classmethod
 def eat1(self, age): # 只能是类中的变量
  # print(self.NAME)
  age = "2"
  self.food = "tang"
 @staticmethod
 def print_1():
  print(Dog.food, Dog.age)

d = Dog("labuladuo")
d.eat(Dog.age) #通过对象调用
Dog.eat(Dog.age) #通过类调用
print("-----1-----")
d.eat1(Dog.age)
Dog.print_1()
print("--------2-------")
Dog.eat1(Dog.age)
Dog.print_1()

输出:

1
gutou
1
gutou
-----1-----
('tang', '1')
--------2-------
('tang', '1')

以上就是解析python 类方法、对象方法、静态方法的详细内容,更多关于python 类方法、对象方法、静态方法的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
Python调用微信公众平台接口操作示例
Jul 08 Python
Python set常用操作函数集锦
Nov 15 Python
pandas 两列时间相减换算为秒的方法
Apr 20 Python
一篇文章搞懂Python的类与对象名称空间
Dec 10 Python
python 二维数组90度旋转的方法
Jan 28 Python
python 多线程串行和并行的实例
Feb 22 Python
python实现共轭梯度法
Jul 03 Python
Python 寻找局部最高点的实现
Dec 05 Python
Python vtk读取并显示dicom文件示例
Jan 13 Python
Python3 mmap内存映射文件示例解析
Mar 23 Python
如何使用Python处理HDF格式数据及可视化问题
Jun 24 Python
Django --Xadmin 判断登录者身份实例
Jul 03 Python
浅谈python锁与死锁问题
Aug 14 #Python
Python3.8安装Pygame教程步骤详解
Aug 14 #Python
Python configparser模块应用过程解析
Aug 14 #Python
PyCharm 2020.2 安装详细教程
Sep 25 #Python
Python logging模块handlers用法详解
Aug 14 #Python
Python代码注释规范代码实例解析
Aug 14 #Python
Python发送邮件实现基础解析
Aug 14 #Python
You might like
PHP中的正规表达式(一)
2006/10/09 PHP
php用ini_get获取php.ini里变量值的方法
2015/03/04 PHP
PHP从数组中删除元素的四种方法实例
2017/05/12 PHP
laravel实现查询最后执行的一条sql语句的方法
2019/10/09 PHP
PHP上传图片到数据库并显示的实例代码
2019/12/20 PHP
[原创]静态页面也可以实现预览 列表不同的显示方式
2006/10/14 Javascript
关于hashchangebroker和statehashable的补充文档
2011/08/08 Javascript
SOSO地图JS画出标注和中心点以html形式运行
2013/08/09 Javascript
鼠标移到导航当前位置的LI变色处于选中状态
2013/08/23 Javascript
jQuery 无刷新分页实例代码
2013/11/12 Javascript
js判断iframe内的网页是否滚动到底部触发事件
2014/03/18 Javascript
JS合并数组的几种方法及优劣比较
2014/09/19 Javascript
JavaScript:Date类型全面解析
2016/05/19 Javascript
JavaScrpt的面向对象全面解析
2017/05/09 Javascript
js+html5实现页面可刷新的倒计时效果
2017/07/15 Javascript
JS实现动态生成html table表格的方法分析
2018/07/11 Javascript
微信小程序实现弹出层效果
2020/05/26 Javascript
JS/HTML5游戏常用算法之路径搜索算法 A*寻路算法完整实例
2018/12/14 Javascript
使用Layer组件弹出多个对话框(非嵌套)与关闭及刷新的例子
2019/09/25 Javascript
vue项目打包后提交到git上为什么没有dist这个文件的解决方法
2020/09/16 Javascript
原生js+css实现tab切换功能
2020/09/17 Javascript
js 数据类型判断的方法
2020/12/03 Javascript
使用Python生成url短链接的方法
2015/05/04 Python
python利用datetime模块计算时间差
2015/08/04 Python
Numpy中矩阵matrix读取一列的方法及数组和矩阵的相互转换实例
2018/07/02 Python
对python制作自己的数据集实例讲解
2018/12/12 Python
Python字符串匹配之6种方法的使用详解
2019/04/08 Python
Tensorflow: 从checkpoint文件中读取tensor方式
2020/02/10 Python
简洁自适应404页面HTML好看的404源码
2020/12/16 HTML / CSS
美国婚礼和派对礼品网站:Kate Aspen(新娘送礼会、迎婴派对)
2018/03/28 全球购物
小孩百日宴答谢词
2014/01/15 职场文书
安全负责人任命书
2014/06/06 职场文书
加强作风建设心得体会
2014/10/22 职场文书
故意伤害辩护词
2015/05/21 职场文书
python分分钟绘制精美地图海报
2022/02/15 Python
微信小程序调用python模型
2022/04/21 Python