解析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访问MySQL封装的常用类实例
Nov 11 Python
Python中的defaultdict与__missing__()使用介绍
Feb 03 Python
python用列表生成式写嵌套循环的方法
Nov 08 Python
pycharm修改界面主题颜色的方法
Jan 17 Python
WxPython建立批量录入框窗口
Feb 27 Python
pyQt5实时刷新界面的示例
Jun 25 Python
pandas对dataFrame中某一个列的数据进行处理的方法
Jul 08 Python
python绘制规则网络图形实例
Dec 09 Python
详解Python3中的 input() 函数
Mar 18 Python
python3中确保枚举值代码分析
Dec 02 Python
Python list去重且保持原顺序不变的方法
Apr 03 Python
python3中apply函数和lambda函数的使用详解
Feb 28 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&mysql(二)
2006/10/09 PHP
php目录操作函数之获取目录与文件的类型
2010/12/29 PHP
浅析PHP页面局部刷新功能的实现小结
2013/06/21 PHP
网页的分页下标生成代码(PHP后端方法)
2016/02/03 PHP
Redis使用Eval多个键值自增的操作实例
2016/11/04 PHP
用一段js程序来实现动画功能
2007/03/06 Javascript
简单的无缝滚动程序-仅几行代码
2007/05/08 Javascript
jQuery 学习入门篇附实例代码
2010/03/16 Javascript
JS模拟面向对象全解(一、类型及传递)
2011/07/13 Javascript
js获得当前时区夏令时发生和终止的时间代码
2014/02/23 Javascript
Node.js node-schedule定时任务隔多少分钟执行一次的方法
2015/02/10 Javascript
jQuery扁平化风格下拉框美化插件FancySelect使用指南
2015/02/10 Javascript
jQuery实现复选框批量选择与反选的方法
2015/06/17 Javascript
jquery实现仿新浪微博评论滚动效果
2015/08/06 Javascript
阿里巴巴技术文章分享 Javascript继承机制的实现
2016/01/14 Javascript
JQuery查找子元素find()和遍历集合each的方法总结
2017/03/07 Javascript
使用Bootstrap4 + Vue2实现分页查询的示例代码
2017/12/21 Javascript
Javascript的this详解
2019/03/23 Javascript
JS 设计模式之:工厂模式定义与实现方法浅析
2020/05/06 Javascript
[02:28]DOTA2亚洲邀请赛附加赛 RECAP赛事回顾
2015/01/29 DOTA
python实现报表自动化详解
2017/11/16 Python
基于Numpy.convolve使用Python实现滑动平均滤波的思路详解
2019/05/16 Python
Python 实现一个手机号码获取妹子名字的功能
2019/09/25 Python
Python简单实现词云图代码及步骤解析
2020/06/04 Python
python判断变量是否为列表的方法
2020/09/17 Python
html2 canvas生成清晰的图片实现打印功能
2019/09/23 HTML / CSS
雅萌 (YA-MAN) :日本美容家电领域的龙头企业
2017/05/12 全球购物
英国户外装备商店:Ultimate Outdoors
2019/05/07 全球购物
自荐信格式简述
2014/01/25 职场文书
行政副总岗位职责
2014/02/23 职场文书
建筑工程造价专业自荐信
2014/07/08 职场文书
乡镇党的群众路线教育实践活动领导班子对照检查材料
2014/09/25 职场文书
民事上诉状范文
2015/05/22 职场文书
2019脱贫攻坚工作总结报告范本!
2019/08/06 职场文书
如何使JavaScript休眠或等待
2021/04/27 Javascript
用React Native制作一个简单的游戏引擎
2021/05/27 Javascript