解析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使用cookie库操保存cookie详解
Mar 03 Python
简述Python中的面向对象编程的概念
Apr 27 Python
python用户管理系统
Mar 13 Python
Django集成搜索引擎Elasticserach的方法示例
Jun 04 Python
详解Python 切片语法
Jun 10 Python
python requests使用socks5的例子
Jul 25 Python
Python中注释(多行注释和单行注释)的用法实例
Aug 28 Python
Django通用类视图实现忘记密码重置密码功能示例
Dec 17 Python
python随机模块random使用方法详解
Feb 14 Python
python实现音乐播放和下载小程序功能
Apr 26 Python
新版Pycharm中Matplotlib不会弹出独立的显示窗口的问题
Jun 02 Python
python 中的@运算符使用
May 26 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
轻松入门: 煮好咖啡的七个诀窍
2021/03/03 冲泡冲煮
php不允许用户提交空表单(php空值判断)
2013/11/12 PHP
php使用socket post数据到其它web服务器的方法
2015/06/02 PHP
flash javascript之间的通讯方法小结
2008/12/20 Javascript
js常用排序实现代码
2010/12/28 Javascript
Javascript调用C#代码
2011/01/17 Javascript
基于jquery的无缝循环新闻列表插件
2011/03/07 Javascript
Javascript学习笔记 delete运算符
2011/09/13 Javascript
Moment.js 不容错过的超棒Javascript日期处理类库
2012/04/15 Javascript
Javascript引用指针使用介绍
2012/11/07 Javascript
JavaScript基础教程之alert弹出提示框实例
2014/10/16 Javascript
jQuery中$.each使用详解
2015/01/29 Javascript
jquery.cookie实现的客户端购物车操作实例
2015/12/24 Javascript
修改js confirm alert 提示框文字的简单实例
2016/06/10 Javascript
Javascript json object 与string 相互转换的简单实现
2016/09/27 Javascript
详解JavaScript中js对象与JSON格式字符串的相互转换
2017/02/14 Javascript
基于JavaScript实现无限加载瀑布流
2017/07/21 Javascript
基于JavaScript 性能优化技巧心得(分享)
2017/12/11 Javascript
Nodejs中crypto模块的安全知识讲解
2018/01/03 NodeJs
小程序实现人脸识别功能(百度ai)
2018/12/23 Javascript
使用vue2.6实现抖音【时间轮盘】屏保效果附源码
2019/04/24 Javascript
js实现圆形显示鼠标单击位置
2020/02/11 Javascript
Vue 中使用 typescript的方法详解
2020/02/17 Javascript
[02:18]《我与DAC》之工作人员:为了热爱DOTA2的玩家们
2018/03/28 DOTA
python生成器表达式和列表解析
2016/03/10 Python
Python使用itertools模块实现排列组合功能示例
2018/07/02 Python
使用html2canvas将页面转成图并使用用canvas2image下载
2019/04/04 HTML / CSS
倩碧英国官网:Clinique英国
2018/08/10 全球购物
日本著名的服饰鞋帽综合类购物网站:MAGASEEK
2019/01/09 全球购物
临床医学大学生求职信
2013/09/28 职场文书
大学学习生活感言
2014/01/18 职场文书
深入开展党的群众路线教育实践活动心得体会
2014/11/05 职场文书
2015年财务经理工作总结
2015/05/13 职场文书
工作简报怎么写
2015/07/21 职场文书
2015年村级财务管理制度
2015/08/04 职场文书
Java实现扫雷游戏详细代码讲解
2022/05/25 Java/Android