Python基础之类方法和静态方法
小叙一会儿:
通常情况下,在类中定义的所有函数(注意了,这里说的就是所有,跟self啥的没关系,self也只是一个再普通不过
的参数而已)都是对象的绑定方法,对象在调用绑定方法时会自动将自己作为参数传递给方法的第一个参数。除此之外还
有两种常见的方法:静态方法和类方法,二者是为类量身定制的,但是实例非要使用,也不会报错,后续将介绍。
一、类方法:
定义:在类里面把一个方法绑定给类,说白了类方法是给类用的,该方法由装饰器@classmethod所装饰,类.绑定
到类的方法(),会把类本身当做第一个参数自动传给绑定到类的方法中。
class A: #创建父类
x = 1
@classmethod #使用装饰器,变为类的绑定方法
def test(cls): #定义了类的方法
print(cls,cls.x)#拿掉一个类的内存地址后,就可以实例化或者引用类的属性了 class B(A): #子类B,B中没有test类的绑定方法,就去父类中找,并将类名当第一个位置参数自动传到方法里
x = 2 B.test() #调用test类的绑定方法
print(B.test) #查看B.test的属性
-------------输出结果----------------
<class '__main__.B'> 2
<bound method A.test of <class '__main__.B'>> #test是A的绑定方法,这里B继承了
应用场景:
class Date:
def __init__(self,year,month,day):
self.year = year
self.month = month
self.day = day
@classmethod
def now(cls):
t = time.localtime()
obj = cls(t.tm_year,t.tm_mon,t.tm_mday)
return obj
@classmethod
def tomorrow(cls):
t = time.localtime(time.time()+86400)
obj = cls(t.tm_year,t.tm_mon,t.tm_mday)
return obj class EuroDate(Date): #__str__,打印由这个类产生的对象时,会触发执行
def __str__(self): #定义在类内部,必须返回一个字符串类型
return "年:%s,月:%s,日:%s"%(self.year,self.month,self.day) e1 = EuroDate(2016,12,13) #实例化对象e1
print(e1)
e2 = EuroDate.now() #调用类的绑定方法,并赋值给e2
print(e2) #打印返回结果
e3 = EuroDate.tomorrow() #调用类的绑定方法,并赋值给e3
print(e3) #打印返回结果
print(EuroDate.now) #查看数据类型
print(EuroDate.tomorrow) #查看数据类型
---------------输出结果---------------
年:2016,月:12,日:13
年:2017,月:4,日:22
年:2017,月:4,日:23
<bound method Date.now of <class '__main__.EuroDate'>>
<bound method Date.tomorrow of <class '__main__.EuroDate'>>
强调,注意注意注意:静态方法和类方法虽然是给类准备的,但是如果实例去用,也是可以用的,只不过实例去调
用的时候容易让人混淆,不知道你要干啥。
二、静态方法:
定义:是一种普通函数,在类的作用域里面时,不会对任何实例类型进行操作,前面必须要加上一个装饰器
@staticmethod,我们将这种方法就称为静态方法。
class A:
@staticmethod #相当于test = staticmethod(test)
def test(x,y,z): #把函数test做成静态方法,self和x啥的没有不同都是参数名
print(x,y,z)
静态方法与绑定方法的区别:
1、凡是定义在类的内部,并且没有被任何装饰器修饰过的方法,都是绑定方法:有自动传值功能;
2、但凡是定义在类的内部,并且被staticmethod装饰器修饰过的方法,都是解除绑定的方法,实际上就函数:
就没有自动传值功能了。
使用演示:
print(type(A.test)) #类型本质就是函数
A.test(1,2,3) #调用函数应该有几个参数就传几个参数
a = A() #实例化对象a
a.test(3,2,1) #对象a在调用test,此时test就是一普通函数,有几个形参就要传几个值
print(type(a.test)) #类型本质就是函数
--------------输出结果-----------------
<class 'function'> #A.test的类型就是函数
1 2 3
3 2 1
<class 'function'> #a.test的类型就是函数
应用场景:
import time
class Date:
def __init__(self,year,month,day):
self.year=year
self.month=month
self.day=day
@staticmethod
def now(): #用Date.now()的形式去产生实例,该实例用的是当前时间
t=time.localtime() #获取结构化的时间格式
return Date(t.tm_year,t.tm_mon,t.tm_mday) #新建实例并且返回
@staticmethod
def tomorrow():#用Date.tomorrow()的形式去产生实例,该实例用的是明天的时间
t=time.localtime(time.time()+86400)
return Date(t.tm_year,t.tm_mon,t.tm_mday) #新建实例并且返回 a=Date('2008',8,18) #实例化对象,自己定义时间
b=Date.now() #采用当前时间
c=Date.tomorrow() #采用明天的时间 print(a.year,a.month,a.day) #打印实例化对象的时间,年,月,日
print(b.year,b.month,b.day)
print(c.year,c.month,c.day)
----------------输出结果---------------------
2008 8 18
2017 4 21
2017 4 22
注意:计算机是不知道年、月、日,这个概念的,计算机只知道秒。so,一天的时间,都得换算成秒。
one_day = 24(小时) * 60(分) * 60(秒) =86400(秒)。
Python基础之类方法和静态方法的更多相关文章
- Python基础04_str_方法
所有的练习都是用的python3 ,还没试过python2 ############## 必须要会的7个基本方法 ############## join split find strip upper ...
- python基础--魔法方法、迭代器、上下文管理
isinstance:判断一个对象是否是某个类的实例 参数一:要判断的对象 参数二:要判断的类型 issubclass:判断一个类是否是另一个类的子类 参数一:是待判断的子类 参数二:待判断的父类 _ ...
- python基础----__slots__方法、__call__方法
''' 1.__slots__是什么:是一个类变量,变量值可以是列表,元祖,或者可迭代对象,也可以是一个字符串(意味着所有实例只有一个数据属性) 2.引子:使用点来访问属性本质就是在访问类或者对象的_ ...
- Python基础数据类型方法补充
str 补充的方法: capitalize():首字母大写,其余变小写 s = 'liBAI' s1 = s.capitalize() print(s1) # Libai swapcase():大小写 ...
- Python基础(10)——类进阶(静态方法、类方法、属性方法)
以下方法为高级方法,一般来说没什么卵用 1.静态方法 @staticmethod 相当于把类内的函数从类内独立出来,只是名义上归类管,实际上不可以调用类内的变量和函数 通过@staticmethod装 ...
- python基础——特性(property)、静态方法(staticmethod)和类方法(classmethod)
python基础--特性(property) 1 什么是特性property property是一种特殊的属性,访问它时会执行一段功能(函数)然后返回值 import math class Circl ...
- 【转】Python基础-封装与扩展、静态方法和类方法
[转]Python基础-封装与扩展.静态方法和类方法 一.封装与扩展 封装在于明确区分内外,使得类实现者可以修改封装内的东西而不影响外部调用者的代码:而外部使用者只知道一个接口(函数),只要接口(函数 ...
- 二十六. Python基础(26)--类的内置特殊属性和方法
二十六. Python基础(26)--类的内置特殊属性和方法 ● 知识框架 ● 类的内置方法/魔法方法案例1: 单例设计模式 # 类的魔法方法 # 案例1: 单例设计模式 class Teacher: ...
- Python基础-封装与扩展、静态方法和类方法
一.封装与扩展 封装在于明确区分内外,使得类实现者可以修改封装内的东西而不影响外部调用者的代码:而外部使用者只知道一个接口(函数),只要接口(函数)名.参数不变,使用者的代码永远无需改变.这就提供一个 ...
随机推荐
- 4-20模块 序列化模块 hashlib模块
1,模块,py文件就是模块,py之所以好用就是模块多. 2,模块的分类: 1,内置模块,python 安装时自带的模块 2,扩展模块,别人写好的,需要安装之后,可以直接使用.itchat微信模块, b ...
- B - Tree Rotations HYSBZ - 2212 (线段树合并)
题目链接:https://cn.vjudge.net/contest/287725#problem/B 题目大意:现在有一棵二叉树,所有非叶子节点都有两个孩子.在每个叶子节点上有一个权值(有n个叶子节 ...
- Django学习手册 - 连接mysql数据库
版本问题: 首先确认django.msql.python版本是统一支持 当前所用的版本信息: Django setting.py 配置 替换之前的DATABASES 配置: DATABASES = { ...
- MySql 在cmd下的学习笔记 —— 有关游标的操作(cursor)
---恢复内容开始--- cursor 指在1条sql,对应N条资源,取出资源的接口/句柄,就是游标 沿着游标,可以一次取出一行 对于游标,必须要先声明一下 fetch 会读取每一条记录,当没有时,会 ...
- python读取两个文件并且判断是否一致
''' 判断两个文件是否相同,如果不同请指出第几行不相同 ''' def f1vsf2(name1,name2): f1 = open(name1) f2 = open(name2) count = ...
- valueForKeyPath用途
可能大家对- (id)valueForKeyPath:(NSString *)keyPath方法不是很了解. 其实这个方法非常的强大,举个例子: NSArray *array = @[@"n ...
- Matlab调用C程序
Matlab调用C程序 复制来自https://blog.csdn.net/u010839382/article/details/42463237 Matlab是矩阵语言,如果运算可以用矩阵实现, ...
- 关于CaciiEZ端口流量阀值报警的设置
作者:邓聪聪 环境:CactiEZ v10.1 为了更高效的发现问题,在非工作期间,公司的网络可能会出现一些故障,为了及时解决问题,所以做了一个流量监控,并以邮件的方式发送流量异常的端口,以便及时了解 ...
- requests库入门02-简单了解HTTP协议
HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送协议. HTT ...
- Git系列②之部署企业级开源仓库gitlab服务器
Git系列②之部署企业级开源仓库gitlab服务器 上一篇我们介绍了github的常见使用方法,下面开始部署本地开源仓库gitlab GitLab 是一个用于仓库管理系统的开源项目. 1.安装配置gi ...