解析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 当前全局变量和入口参数的所有属性
Jul 01 Python
Python中的连接符(+、+=)示例详解
Jan 13 Python
linux平台使用Python制作BT种子并获取BT种子信息的方法
Jan 20 Python
python3使用smtplib实现发送邮件功能
May 22 Python
Python实现的连接mssql数据库操作示例
Aug 17 Python
python实现一个函数版的名片管理系统过程解析
Aug 27 Python
Python逐行读取文件内容的方法总结
Feb 14 Python
解决tensorboard多个events文件显示紊乱的问题
Feb 15 Python
TensorFlow实现批量归一化操作的示例
Apr 22 Python
使用Python将图片转正方形的两种方法实例代码详解
Apr 29 Python
python使用XPath解析数据爬取起点小说网数据
Apr 22 Python
Python字符串的转义字符
Apr 07 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中jQuery插件autocomplate的简单使用笔记
2012/06/14 PHP
php中的登陆login实例代码
2016/06/20 PHP
yii 2.0中表单小部件的使用方法示例
2017/05/23 PHP
Yii 2.0如何使用页面缓存方法示例
2017/05/23 PHP
禁止F5等快捷键的JS代码
2007/03/06 Javascript
常见的原始JS选择器使用方法总结
2014/04/09 Javascript
纯javascript制作日历控件
2015/07/17 Javascript
AngularJS中关于ng-class指令的几种实现方式详解
2016/09/17 Javascript
JS实现用户注册时获取短信验证码和倒计时功能
2016/10/27 Javascript
Angularjs单选改为多选的开发过程及问题解析
2017/02/17 Javascript
jQuery插件echarts设置折线图中折线线条颜色和折线点颜色的方法
2017/03/03 Javascript
js常用的继承--组合式继承
2017/03/06 Javascript
js 获取元素的具体样式信息getcss(实例讲解)
2017/07/05 Javascript
layer.open组件获取弹出层页面变量、函数的实例
2019/09/25 Javascript
vue源码中的检测方法的实现
2019/09/26 Javascript
vue 获取元素额外生成的data-v-xxx操作
2020/09/09 Javascript
[01:08:00]Fnatic vs Winstrike 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
python里大整数相乘相关技巧指南
2014/09/12 Python
python将unicode转为str的方法
2017/06/21 Python
Python实现的矩阵类实例
2017/08/22 Python
django echarts饼图数据动态加载的实例
2019/08/12 Python
python 计算两个列表的相关系数的实现
2019/08/29 Python
python实现可下载音乐的音乐播放器
2020/02/25 Python
python数据库开发之MongoDB安装及Python3操作MongoDB数据库详细方法与实例
2020/03/18 Python
利用python中的matplotlib打印混淆矩阵实例
2020/06/16 Python
PyCharm Ctrl+Shift+F 失灵的简单有效解决操作
2021/01/15 Python
HTML5 canvas画图并保存成图片的jcanvas插件
2014/01/17 HTML / CSS
ASOS比利时:英国线上零售商及自有品牌
2018/07/29 全球购物
写出二分查找算法的两种实现
2013/05/13 面试题
《太阳》教学反思
2014/02/21 职场文书
公证委托书大全
2014/04/04 职场文书
应聘销售主管的求职信
2014/04/26 职场文书
优秀工会工作者事迹材料
2014/06/02 职场文书
公司年夜饭通知
2015/04/25 职场文书
工程竣工验收申请报告
2015/05/15 职场文书
摩登时代观后感
2015/06/03 职场文书