解析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 相关文章推荐
django框架如何集成celery进行开发
May 24 Python
python中安装Scrapy模块依赖包汇总
Jul 02 Python
从CentOS安装完成到生成词云python的实例
Dec 01 Python
Pycharm在创建py文件时,自动添加文件头注释的实例
May 07 Python
Python os.access()用法实例
Feb 18 Python
python获取微信企业号打卡数据并生成windows计划任务
Apr 30 Python
如何用Python制作微信好友个性签名词云图
Jun 28 Python
浅谈Python中(&,|)和(and,or)之间的区别
Aug 07 Python
使用python制作一个解压缩软件
Nov 13 Python
Python爬虫如何应对Cloudflare邮箱加密
Jun 24 Python
Python3中PyQt5简单实现文件打开及保存
Jun 10 Python
Python利用zhdate模块实现农历日期处理
Mar 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设计模式 DAO(数据访问对象模式)
2011/06/26 PHP
PHP抓取淘宝商品的用户晒单评论+图片+搜索商品列表实例
2016/04/14 PHP
选择TreeView控件的树状数据节点的JS方法(jquery)
2010/02/06 Javascript
javascript返回顶部效果(自写代码)
2013/01/06 Javascript
JavaScript调用后台的三种方法实例
2013/10/17 Javascript
js简单实现删除记录时的提示效果
2013/12/05 Javascript
使用 js+正则表达式为关键词添加链接
2014/11/11 Javascript
javascript检测flash插件是否被禁用的方法
2016/01/14 Javascript
静态页面html中跳转传值的JS处理技巧
2016/06/22 Javascript
Angular.JS判断复选框checkbox是否选中并实时显示
2016/11/30 Javascript
Bootstrap源码解读表单(2)
2016/12/22 Javascript
BootStrap给table表格的每一行添加一个按钮事件
2017/09/07 Javascript
JS设计模式之数据访问对象模式的实例讲解
2017/09/30 Javascript
Vue2.5学习笔记之如何在项目中使用和配置Vue
2018/09/26 Javascript
微信小程序rich-text富文本用法实例分析
2019/05/20 Javascript
微信小程序缓存支持二次开发封装实现解析
2019/12/16 Javascript
JavaScript实现简单日历效果
2020/09/11 Javascript
Python多进程通信Queue、Pipe、Value、Array实例
2014/11/21 Python
Python中矩阵库Numpy基本操作详解
2017/11/21 Python
TensorFlow实现iris数据集线性回归
2018/09/07 Python
使用PyQt4 设置TextEdit背景的方法
2019/06/14 Python
在windows下使用python进行串口通讯的方法
2019/07/02 Python
django创建最简单HTML页面跳转方法
2019/08/16 Python
windows 10 设定计划任务自动执行 python 脚本的方法
2019/09/11 Python
Python 实现自动获取种子磁力链接方式
2020/01/16 Python
Python 面向对象之类class和对象基本用法示例
2020/02/02 Python
Django 解决distinct无法去除重复数据的问题
2020/05/20 Python
Scrapy爬虫文件批量运行的实现
2020/09/30 Python
50个强大璀璨的CSS3/JS技术运用实例
2010/02/27 HTML / CSS
美国酒店控股公司:Choice Hotels
2018/06/15 全球购物
银行演讲稿范文
2014/01/03 职场文书
大学感恩节活动策划方案
2014/10/11 职场文书
暑假社会实践证明格式
2014/10/28 职场文书
给上级领导的感谢信
2015/01/22 职场文书
三八节活动简报
2015/07/20 职场文书
《孙子兵法》:欲成大事者,需读懂这些致胜策略
2019/08/23 职场文书