解析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的Django框架中的通用视图
May 04 Python
用Python遍历C盘dll文件的方法
May 06 Python
详解Python的Django框架中的templates设置
May 11 Python
读取本地json文件,解析json(实例讲解)
Dec 06 Python
python+pygame简单画板实现代码实例
Dec 13 Python
python pandas中对Series数据进行轴向连接的实例
Jun 08 Python
python去掉 unicode 字符串前面的u方法
Oct 21 Python
对Python3 pyc 文件的使用详解
Feb 16 Python
Python中使用双下划线防止类属性被覆盖问题
Jun 27 Python
用Python实现将一张图片分成9宫格的示例
Jul 05 Python
详解python 降级到3.6终极解决方案
Feb 06 Python
python中的django是做什么的
Jul 31 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中如何实现常用邮箱的基本判断
2014/01/07 PHP
在Laravel5.6中使用Swoole的协程数据库查询
2018/06/15 PHP
一个不错的应用,用于提交获取文章内容,不推荐用
2007/03/03 Javascript
js字符串转换成数字与数字转换成字符串的实现方法
2014/01/08 Javascript
ExtJs纵坐标值重复问题的解决方法
2014/02/27 Javascript
javascript中replace( )方法的使用
2015/04/24 Javascript
JavaScript AOP编程实例
2015/06/16 Javascript
jquery实现经典的淡入淡出选项卡效果代码
2015/09/22 Javascript
JavaScript简单遍历DOM对象所有属性的实现方法
2015/10/21 Javascript
开启Javascript中apply、call、bind的用法之旅模式
2015/10/28 Javascript
详解AngularJS控制器的使用
2016/03/09 Javascript
将json转换成struts参数的方法
2016/11/08 Javascript
js实现简单数字变动效果
2017/11/06 Javascript
原生JS实现循环Nodelist Dom列表的4种方式示例
2018/02/11 Javascript
nodejs如何在package.json中设置多条启动命令
2020/03/16 NodeJs
详解webpack的文件监听实现(热更新)
2020/09/11 Javascript
js canvas实现俄罗斯方块
2020/10/11 Javascript
[06:06]2018DOTA2亚洲邀请赛主赛事第四日战况回顾 全明星赛欢乐上演
2018/04/07 DOTA
python计算最小优先级队列代码分享
2013/12/18 Python
Python常用小技巧总结
2015/06/01 Python
Python算法应用实战之栈详解
2017/02/04 Python
在python中对变量判断是否为None的三种方法总结
2019/01/23 Python
python常见字符串处理函数与用法汇总
2019/10/30 Python
Python生成pdf目录书签的实例方法
2020/10/29 Python
HTML5 b和i标记将被赋予真正的语义
2009/07/16 HTML / CSS
英国设计的甲板鞋和船鞋:Chatham
2018/12/06 全球购物
Linux如何修改文件和文件夹的权限
2012/06/27 面试题
php优化查询foreach代码实例讲解
2021/03/24 PHP
出国留学介绍信
2014/01/13 职场文书
初中考试作弊检讨书
2014/02/01 职场文书
安全演讲稿大全
2014/05/09 职场文书
现场活动策划方案
2014/08/22 职场文书
校园安全教育心得体会
2016/01/15 职场文书
matplotlib画混淆矩阵与正确率曲线的实例代码
2021/06/01 Python
MySQL系列之一 MariaDB-server安装
2021/07/02 MySQL
ssh服务器拒绝了密码 请再试一次已解决(亲测有效)
2022/08/14 Servers