解析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中使用pprint函数进行格式化输出的教程
Apr 07 Python
浅谈Python中列表生成式和生成器的区别
Aug 03 Python
Python数据结构之双向链表的定义与使用方法示例
Jan 16 Python
DataFrame中的object转换成float的方法
Apr 10 Python
Mac下Anaconda的安装和使用教程
Nov 29 Python
详解Python给照片换底色(蓝底换红底)
Mar 22 Python
python之pyqt5通过按钮改变Label的背景颜色方法
Jun 13 Python
浅谈pytorch池化maxpool2D注意事项
Feb 18 Python
在tensorflow以及keras安装目录查询操作(windows下)
Jun 19 Python
使用tensorflow进行音乐类型的分类
Aug 14 Python
Python3读写ini配置文件的示例
Nov 06 Python
python+pytest接口自动化之token关联登录的实现
Apr 06 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检测用户是否关闭浏览器的方法
2016/02/14 PHP
php数据库的增删改查 php与javascript之间的交互
2017/08/31 PHP
PHP使用ActiveMQ实例
2018/02/05 PHP
js下获得客户端操作系统的函数代码(1:vista,2:windows7,3:2000,4:xp,5:2003,6:2008)
2011/10/31 Javascript
JS的replace方法详细介绍
2012/11/09 Javascript
document.execCommand()的用法小结
2014/01/08 Javascript
基于jQuery通过jQuery.form.js插件使用ajax提交form表单
2015/08/17 Javascript
angularjs学习笔记之简单介绍
2015/09/26 Javascript
一个Vue页面的内存泄露分析详解
2018/06/25 Javascript
swiper Scrollbar滚动条组件详解
2019/09/08 Javascript
Vue事件处理原理及过程详解
2020/03/11 Javascript
JavaScript中的this妙用实例分析
2020/05/09 Javascript
[46:21]Liquid vs LGD 2018国际邀请赛淘汰赛BO3 第一场 8.23
2018/08/24 DOTA
python基础教程之Hello World!
2014/08/29 Python
Python中使用SAX解析xml实例
2014/11/21 Python
编写Python小程序来统计测试脚本的关键字
2016/03/12 Python
python3批量删除豆瓣分组下的好友的实现代码
2016/06/07 Python
python 批量修改/替换数据的实例
2018/07/25 Python
Python 监测文件是否更新的方法
2019/06/10 Python
Python测试模块doctest使用解析
2019/08/10 Python
浅析PyTorch中nn.Linear的使用
2019/08/18 Python
python实现单目标、多目标、多尺度、自定义特征的KCF跟踪算法(实例代码)
2020/01/08 Python
Python调用Redis的示例代码
2020/11/24 Python
Python中对象的比较操作==和is区别详析
2021/02/12 Python
Python爬虫+tkinter界面实现历史天气查询的思路详解
2021/02/22 Python
俄罗斯第一家多品牌在线奢侈品精品店:Aizel.ru
2020/09/06 全球购物
职称自我鉴定
2013/10/15 职场文书
新年晚会主持词
2014/03/24 职场文书
青蓝工程实施方案
2014/03/27 职场文书
改革共识倡议书
2014/08/29 职场文书
优秀共青团员事迹材料
2014/12/25 职场文书
2015年九一八事变纪念日演讲稿
2015/03/19 职场文书
redis实现的四种常见限流策略
2021/06/18 Redis
JavaScript中的宏任务和微任务详情
2021/11/27 Javascript
Linux、ubuntu系统下查看显卡型号、显卡信息详解
2022/04/07 Servers
nginx 添加http_stub_status_module模块
2022/05/25 Servers