解析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实现保存网页到本地示例
Mar 16 Python
Python发送form-data请求及拼接form-data内容的方法
Mar 05 Python
Python彩色化Linux的命令行终端界面的代码实例分享
Jul 02 Python
python读取二进制mnist实例详解
May 31 Python
Selenium元素的常用操作方法分析
Aug 10 Python
python3 pygame实现接小球游戏
May 14 Python
python脚本调用iftop 统计业务应用流量的思路详解
Oct 11 Python
Python使用Chrome插件实现爬虫过程图解
Jun 09 Python
浅谈keras2 predict和fit_generator的坑
Jun 17 Python
python删除指定列或多列单个或多个内容实例
Jun 28 Python
Python改变对象的字符串显示的方法
Aug 01 Python
Pandas对每个分组应用apply函数的实现
Dec 13 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 smarty的预保留变量总结
2008/12/04 PHP
php 数组排序 array_multisort与uasort的区别
2011/03/24 PHP
php不使用插件导出excel的简单方法
2014/03/04 PHP
PHP回调函数简单用法示例
2019/05/08 PHP
DOM 基本方法
2009/07/18 Javascript
js+HTML5实现canvas多种颜色渐变效果的方法
2015/06/05 Javascript
javascript之Array 数组对象详解
2016/06/07 Javascript
AngularJS基础 ng-keydown 指令简单示例
2016/08/02 Javascript
利用jquery获取select下拉框的值
2016/11/23 Javascript
jQuery实现菜单栏导航效果
2017/08/15 jQuery
laravel5.3 vue 实现收藏夹功能实例详解
2018/01/21 Javascript
vue使用xe-utils函数库的具体方法
2018/03/06 Javascript
详解vantUI框架在vue项目中的应用踩坑
2018/12/06 Javascript
Vue加载json文件的方法简单示例
2019/01/28 Javascript
Vue+Element实现表格编辑、删除、以及新增行的最优方法
2019/05/28 Javascript
发布订阅模式在vue中的实际运用实例详解
2019/06/09 Javascript
python通过yield实现数组全排列的方法
2015/03/18 Python
详细解读Python中解析XML数据的方法
2015/10/15 Python
python画出三角形外接圆和内切圆的方法
2018/01/25 Python
对python内置map和six.moves.map的区别详解
2018/12/19 Python
Python函数的返回值、匿名函数lambda、filter函数、map函数、reduce函数用法实例分析
2019/12/26 Python
在ipython notebook中使用argparse方式
2020/04/20 Python
Python中zipfile压缩文件模块的基本使用教程
2020/06/14 Python
python 如何调用 dubbo 接口
2020/09/24 Python
手摸手教你用canvas实现给图片添加平铺水印的实现
2019/08/20 HTML / CSS
美国知名艺术画网站:Art.com
2017/02/09 全球购物
夏季奶茶店创业计划书
2014/01/16 职场文书
医学专业应届生的自我评价
2014/02/28 职场文书
体育口号大全
2014/06/18 职场文书
装修施工安全责任书
2014/07/24 职场文书
关于保护环境的建议书
2014/08/26 职场文书
暑期社会实践心得体会
2014/09/02 职场文书
庆祝三八妇女节标语
2014/10/09 职场文书
销售内勤岗位职责范本
2015/04/13 职场文书
mysql如何能有效防止删库跑路
2021/10/05 MySQL
Java版 简易五子棋小游戏
2022/05/04 Java/Android