解析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中文乱码的解决方法
Nov 04 Python
pymssql数据库操作MSSQL2005实例分析
May 25 Python
在Python的Django框架中显示对象子集的方法
Jul 21 Python
python3使用urllib模块制作网络爬虫
Apr 08 Python
Python 模块EasyGui详细介绍
Feb 19 Python
Python遍历文件夹和读写文件的实现方法
May 10 Python
Python面向对象之静态属性、类方法与静态方法分析
Aug 24 Python
Python实现的对一个数进行因式分解操作示例
Jun 27 Python
Django配置MySQL数据库的完整步骤
Sep 07 Python
python安装本地whl的实例步骤
Oct 12 Python
基于Python获取照片的GPS位置信息
Jan 20 Python
iPython pylab模式启动方式
Apr 24 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得到mssql的存储过程的输出参数功能实现
2012/11/23 PHP
PHP函数nl2br()与自定义函数nl2p()换行用法分析
2016/04/02 PHP
PHP命令空间namespace及use的用法小结
2017/11/27 PHP
PHP实现的折半查找算法示例
2017/12/19 PHP
PHP命名空间简单用法示例
2018/12/28 PHP
laravel框架中路由设置,路由参数和路由命名实例分析
2019/11/23 PHP
javascript实现面向对象类的功能书写技巧
2010/03/07 Javascript
jQuery.clean使用方法及思路分析
2013/01/07 Javascript
JavaScript判断文件上传类型的方法
2014/09/02 Javascript
Javascript中匿名函数的调用与写法实例详解(多种)
2016/01/26 Javascript
整理AngularJS框架使用过程当中的一些性能优化要点
2016/03/05 Javascript
jQuery each函数源码分析
2016/05/25 Javascript
移动端 一个简单易懂的弹出框
2016/07/06 Javascript
Javascript中浏览器窗口的基本操作总结
2016/08/18 Javascript
详解为Angular.js内置$http服务添加拦截器的方法
2016/12/20 Javascript
详解如何使用webpack在vue项目中写jsx语法
2017/11/08 Javascript
axios 处理 302 状态码的解决方法
2018/04/10 Javascript
值得收藏的八个常用的js正则表达式
2018/10/19 Javascript
在Create React App中启用Sass和Less的方法示例
2019/01/16 Javascript
在vue中使用echars实现上浮与下钻效果
2019/11/08 Javascript
JS实现百度搜索框
2021/02/25 Javascript
python正则匹配查询港澳通行证办理进度示例分享
2013/12/27 Python
使用Django的模版来配合字符串翻译工作
2015/07/27 Python
Python 中判断列表是否为空的方法
2019/11/24 Python
HTML5本地存储localStorage、sessionStorage基本用法、遍历操作、异常处理等
2014/05/08 HTML / CSS
5 个强大的HTML5 API 函数推荐
2014/11/19 HTML / CSS
加拿大最大的书店:Indigo
2017/01/01 全球购物
潘多拉珠宝英国官方网上商店:PANDORA英国
2018/06/12 全球购物
三年大学生活自我鉴定
2014/01/21 职场文书
加强机关作风建设心得体会
2014/10/22 职场文书
具结保证书
2015/01/17 职场文书
企业办公室主任岗位职责
2015/04/01 职场文书
物业工程部经理岗位职责
2015/04/09 职场文书
领导离职感言
2015/08/03 职场文书
2019年大学生职业生涯规划书最新范文
2019/03/25 职场文书
Python requests用法和django后台处理详解
2022/03/19 Python