解析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 ljust rjust center输出
Sep 06 Python
python中stdout输出不缓存的设置方法
May 29 Python
儿童python练习实例
May 27 Python
Python实现提取XML内容并保存到Excel中的方法
Sep 01 Python
Python基于opencv调用摄像头获取个人图片的实现方法
Feb 21 Python
Python queue队列原理与应用案例分析
Sep 27 Python
python在不同条件下的输入与输出
Feb 13 Python
浅谈pytorch池化maxpool2D注意事项
Feb 18 Python
Python操作Excel把数据分给sheet
May 20 Python
Python 合并拼接字符串的方法
Jul 28 Python
Python filter()及reduce()函数使用方法解析
Sep 05 Python
python爬取微博评论的实例讲解
Jan 15 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
递归列出所有文件和目录
2006/10/09 PHP
屏蔽浏览器缓存另类方法
2006/10/09 PHP
php REMOTE_ADDR之获取访客IP的代码
2008/04/22 PHP
PHP中session变量的销毁
2014/02/27 PHP
php+ajax导入大数据时产生的问题处理
2014/06/11 PHP
PHP生成压缩文件实例
2015/02/07 PHP
php基于Snoopy解析网页html的方法
2015/07/09 PHP
kindeditor 加入七牛云上传的实例讲解
2017/11/12 PHP
Laravel 修改验证异常的响应格式实例代码详解
2020/05/25 PHP
JavaScript 常用函数
2009/12/30 Javascript
Javascript中判断变量是数组还是对象(array还是object)
2013/08/14 Javascript
Bootstrap插件全集
2016/07/18 Javascript
jQuery实现导航高亮的方法【附demo源码下载】
2016/11/09 Javascript
DWR3 访问WEB元素的两种方法实例详解
2017/01/03 Javascript
vue移动端裁剪图片结合插件Cropper的使用实例代码
2017/07/10 Javascript
javascript用rem来做响应式开发
2018/01/13 Javascript
d3.js实现自定义多y轴折线图的示例代码
2018/05/30 Javascript
vue踩坑记-在项目中安装依赖模块npm install报错
2019/04/02 Javascript
Vue可自定义tab组件用法实例
2019/10/24 Javascript
[02:15]2014DOTA2国际邀请赛 赛后退役选手回顾
2014/08/01 DOTA
用Python实现服务器中只重载被修改的进程的方法
2015/04/30 Python
python字符串查找函数的用法详解
2019/07/08 Python
python使用if语句实现一个猜拳游戏详解
2019/08/27 Python
python GUI库图形界面开发之PyQt5布局控件QGridLayout详细使用方法与实例
2020/03/06 Python
德国BA保镖药房韩文网:kr.ba.de
2017/09/04 全球购物
中学教师管理制度
2014/01/14 职场文书
火锅店创业计划书范文
2014/02/02 职场文书
爽歪歪广告词
2014/03/20 职场文书
部门活动策划方案
2014/08/16 职场文书
高一军训感想
2015/08/07 职场文书
Python 把两层列表展开平铺成一层(5种实现方式)
2021/04/07 Python
Python中threading库实现线程锁与释放锁
2021/05/17 Python
python实现简单聊天功能
2021/07/07 Python
vue使用echarts实现折线图
2022/03/21 Vue.js
Nginx开源可视化配置工具NginxConfig使用教程
2022/06/21 Servers
Mysql中mvcc各场景理解应用
2022/08/05 MySQL