解析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 相关文章推荐
rhythmbox中文名乱码问题解决方法
Sep 06 Python
可用于监控 mysql Master Slave 状态的python代码
Feb 10 Python
Python常用的文件及文件路径、目录操作方法汇总介绍
May 21 Python
Python制作简易注册登录系统
Dec 15 Python
基于python OpenCV实现动态人脸检测
May 25 Python
Python3多进程 multiprocessing 模块实例详解
Jun 11 Python
python使用turtle库绘制时钟
Mar 25 Python
Python使用pyautocad+openpyxl处理cad文件示例
Jul 11 Python
使用opencv将视频帧转成图片输出
Dec 10 Python
python实现快递价格查询系统
Mar 03 Python
python中sympy库求常微分方程的用法
Apr 28 Python
Python 生成短8位唯一id实战教程
Jan 13 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中addslashes函数与sql防注入
2014/11/17 PHP
php实现可用于mysql,mssql,pg数据库操作类
2014/12/13 PHP
PHP获取数组中指定的一列实例
2017/12/27 PHP
laravel 解决groupBy时出现的错误 isn't in Group By问题
2019/10/17 PHP
比较详细的关于javascript 解析json的代码
2009/12/16 Javascript
js动态加载以及确定加载完成的代码
2011/07/31 Javascript
JQuery模板插件 jquery.tmpl 动态ajax扩展
2011/11/10 Javascript
JavaScript高级程序设计 读书笔记之九 本地对象Array
2012/02/27 Javascript
javascript使用中为什么10..toString()正常而10.toString()出错呢
2013/01/11 Javascript
JS操作JSON要领详细总结
2013/08/25 Javascript
jQuery插件slides实现无缝轮播图特效
2015/04/17 Javascript
详解AngularJS实现表单验证
2015/12/10 Javascript
js调用屏幕宽度的简单方法
2016/11/14 Javascript
微信小程序 Toast自定义实例详解
2017/01/20 Javascript
老生常谈combobox和combotree模糊查询
2017/04/17 Javascript
JS实现div模块的截图并下载功能
2017/10/17 Javascript
移动端如何用下拉刷新的方式实现上拉加载
2018/12/10 Javascript
JQuery使用数组遍历跳出each循环
2020/09/01 jQuery
JavaScript实现跟随鼠标移动的盒子
2021/01/28 Javascript
[47:50]Secret vs VP 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
Python脚本暴力破解栅栏密码
2015/10/19 Python
如何在Django中添加没有微秒的 DateTimeField 属性详解
2019/01/30 Python
Python实现KNN(K-近邻)算法的示例代码
2019/03/05 Python
python射线法判断检测点是否位于区域外接矩形内
2019/06/28 Python
python Qt5实现窗体跟踪鼠标移动
2019/12/13 Python
Django Model中字段(field)的各种选项说明
2020/05/19 Python
Keras自动下载的数据集/模型存放位置介绍
2020/06/19 Python
中国入世承诺
2014/04/01 职场文书
六查六看自查报告
2014/10/14 职场文书
王兆力在市委党的群众路线教育实践活动总结大会上的讲话稿
2014/10/25 职场文书
寒假社会实践个人总结
2015/03/06 职场文书
2015年征兵工作总结
2015/07/23 职场文书
CocosCreator如何实现划过的位置显示纹理
2021/04/14 Javascript
mysql 8.0.24版本安装配置方法图文教程
2021/05/12 MySQL
青岛市的收音机研制与生产
2022/04/07 无线电
阿里面试Nacos配置中心交互模型是push还是pull原理解析
2022/07/23 Java/Android