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基础-封装与扩展、静态方法和类方法
一.封装与扩展 封装在于明确区分内外,使得类实现者可以修改封装内的东西而不影响外部调用者的代码:而外部使用者只知道一个接口(函数),只要接口(函数)名.参数不变,使用者的代码永远无需改变.这就提供一个 ...
随机推荐
- 基于Django框架对MongoDB实现增删改查
在上一篇中,咱们已经实现了Scrapy框架爬取数据,并且存储到Mongodb数据库, 接下来呢,,,,,,,,,,,,, 咱们就要对这些数据进行操作. 目标:从Mongodb数据库取出数据,通过Dja ...
- Java基础_0304:构造方法
构造方法 如果要实例化新的对象,那么肯定需要使用关键字new来完成,但是除了new这个关键字之外,还有可能在对象实例化时为其进行一些初始化的准备操作,这个时候就需要构造方法的支持了 构造方法本身是一种 ...
- 【Linux】LD_PRELOAD用法
转载https://blog.csdn.net/iEearth/article/details/49952047 还有一篇博客也可以看看https://blog.csdn.net/xp5xp6/art ...
- 浏览器修改或添加Cookie--chrome插件【edit this cookie】、【postman】
需求背景:某天用浏览器请求某个 API 提示: {"RESULT_TYPE" : -1 , "STATE" : 401 , "RESULT_DESC& ...
- 《jQuery精品教程视频》视频目录
\day01\03-视频\02-使用js的缺点.avi; \day01\03-视频\03-jQuery初体验.avi; \day01\03-视频\04-什么是jQuery.avi; \day01\03 ...
- RPO攻击 & share your mind
参考文章: https://xz.aliyun.com/t/2220 http://www.thespanner.co.uk/2014/03/21/rpo/ https://www.lorexxar. ...
- 【Math for ML】解析几何(Analytic Geometry)
I. 范数(Norm) 定义: 向量空间\(V\)上的范数(norm)是如下函数: \[ \begin{align} \|·\|:V→R, \notag \\ x→\|x\| \notag \end{ ...
- java jvm和android DVM区别
本文转自:http://blog.csdn.net/yujun411522/article/details/45932247 1.Android dvm的进程和Linux的进程, 应用程序的进 ...
- python3 xml模块
一.简介 xml是实现不通语言或程序之间进行数据交换的协议,可扩展标记语言,标准通用标记语言的子集.是一种用于标记电子文件使其具有结构性的标记语言.xml格式如下,是通过<>节点来区别数据 ...
- CentOS6.6 双网卡双网关配置
1.需求: 内网IP:10.63.215.7 网关:10.63.215.254 外网IP:180.168.29.92 网关:180.168.29.89 内外网均可以Ping通,可直接访问 2.IP配置 ...