解析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 open()文件处理使用介绍
Nov 30 Python
Python构造函数及解构函数介绍
Feb 26 Python
使用Python写CUDA程序的方法
Mar 27 Python
Python递归函数定义与用法示例
Jun 02 Python
Python3实现的旋转矩阵图像算法示例
Apr 03 Python
PyQt4编程之让状态栏显示信息的方法
Jun 18 Python
Python 操作mysql数据库查询之fetchone(), fetchmany(), fetchall()用法示例
Oct 17 Python
python语言中有算法吗
Jun 16 Python
使用python求斐波那契数列中第n个数的值示例代码
Jul 26 Python
PyQt实现计数器的方法示例
Jan 18 Python
python中time tzset()函数实例用法
Feb 18 Python
Python机器学习之KNN近邻算法
May 14 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
syphon 虹吸式咖啡冲泡冲煮倒水的得与失
2021/03/03 冲泡冲煮
WindowsXP中快速配置Apache+PHP5+Mysql
2008/06/05 PHP
php异常处理技术,顶级异常处理器
2012/06/13 PHP
PHP中文分词 自动获取关键词介绍
2012/11/13 PHP
PHP数组函数知识汇总
2016/05/12 PHP
js与jquery获取父级元素,子级元素,兄弟元素的实现方法
2014/01/09 Javascript
表单序列化与jq中的serialize使用示例
2014/02/21 Javascript
JavaScript实现刷新不重记的倒计时
2016/08/10 Javascript
基于iscroll.js实现下拉刷新和上拉加载效果
2016/11/28 Javascript
JS 在数组指定位置插入/删除数据的方法
2017/01/12 Javascript
JS排序之冒泡排序详解
2017/04/08 Javascript
使用js获取伪元素的content实例
2017/10/24 Javascript
vue2.0在没有dev-server.js下的本地数据配置方法
2018/02/23 Javascript
Angular5升级RxJS到5.5.3报错:EmptyError: no elements in sequence的解决方法
2018/04/09 Javascript
JavaScript实现点击出现图片并统计点击次数功能示例
2018/07/23 Javascript
ES6 对象的新功能与解构赋值介绍
2019/02/05 Javascript
Python多维/嵌套字典数据无限遍历的实现
2016/11/04 Python
Python获取当前函数名称方法实例分享
2018/01/18 Python
python3.6.3转化为win-exe文件发布的方法
2018/10/31 Python
Python中字符串与编码示例代码
2019/05/20 Python
python递归法实现简易连连看小游戏
2020/03/25 Python
Python3 webservice接口测试代码详解
2020/06/23 Python
使用ITK-SNAP进行抠图操作并保存mask的实例
2020/07/01 Python
Html5移动端适配IphoneX等机型的方法
2019/06/25 HTML / CSS
AmazeUI 点击元素显示全屏的实现
2020/08/25 HTML / CSS
肯尼迪就职演说稿
2013/12/31 职场文书
2014年十一国庆向国旗敬礼寄语
2014/04/11 职场文书
2014年教师节座谈会发言稿
2014/09/10 职场文书
政风行风整改方案
2014/10/25 职场文书
初婚未育证明样本
2015/06/18 职场文书
初一数学教学反思
2016/02/17 职场文书
Python 实现绘制子图及子图刻度的变换等问题
2021/05/31 Python
Vue + iView实现Excel上传功能的完整代码
2021/06/22 Vue.js
关于python中模块和重载的问题
2021/11/02 Python
Python matplotlib安装以及实现简单曲线的绘制
2022/04/26 Python
win7配置本地ftp服务器的图文教程
2022/08/05 Servers