通常情况下,类中函数中定义的所有函数,,都是对象的绑定方法,除此之外,还有专门的静态方法和类方法,这两个是专门给使用的,但是对象非要调用也是不会报错的。

对象在调用的时候会把自己传递给self,也就是绑定方法的第一个参数。

1 静态方法

这里定义spam的时候没有self,而是传入了xyz,类在使用的时候必须传入3个参数

class Foo:@staticmethod  # spam = staticmethod(apam)def spam(x,y,z):print(x,y,z)# spm = staticmethod(spam)Foo.spam(1,2,3)

应用场景

首相先了解下时间模块的使用

>>>import time
>>> time.localtime()
time.struct_time(tm_year=2017, tm_mon=4, tm_mday=22, tm_hour=20, tm_min=7, tm_se
c=41, tm_wday=5, tm_yday=112, tm_isdst=0)
>>> t=time.localtime()
>>> print(t.tm_year)
2017

应用场景

# 应用场景
import time
class Date:def __init__(self,year,month,day):self.year = yearself.month = monthself.day = day@staticmethoddef now():t = time.localtime()obj = Date(t.tm_year,t.tm_mon,t.tm_mday)return obj# d1 = Date(2017,1,12)
# print(d1.year)
date_now =Date.now()  # 使用的时候就不同传参数了 直接调用
print(date_now.year)
print(date_now.month)
print(date_now.day)

date_now =Date.now() 对类来说就是一种实例化,
专门给类用的

增加一个新的

import time
class Date:def __init__(self,year,month,day):self.year = yearself.month = monthself.day = day@staticmethoddef now():t = time.localtime()obj = Date(t.tm_year,t.tm_mon,t.tm_mday)return obj@staticmethoddef tomorrow():t1 = time.localtime(time.time()+86400)obj = Date(t1.tm_year, t1.tm_mon, t1.tm_mday)return obj
# d1 = Date(2017,1,12)
# print(d1.year)
date_now =Date.now()  # 使用的时候就不同传参数了 直接调用
print(date_now.year)
print(date_now.month)
print(date_now.day)
date_tomorrow = Date.tomorrow()  #此时使用的是调用方法是一样的
print(date_tomorrow.year)
print(date_tomorrow.month)
print(date_tomorrow.day)

2 类方法

类方法是专门类的绑定方法

class Foo:def bar(self):pass@classmethod   # 类的绑定方法def test(cls,x):  # 可以传入多个值print(cls,x)
print(Foo.bar)
print(Foo.test)

结果:
function Foo.bar at 0x0000000002B0AB70> 类的函数
bound method Foo.test of <class 'main.Foo'>> 类的绑定方法

类的绑定方法和对象的绑定方法是一样的,会把类本身当做第一个参数传递给类的方法

class Foo:def bar(self):pass@classmethoddef test(cls,x):print(cls,x)  #cls是类的内存地址cls() # 类实例化
# print(Foo.bar)
# print(Foo.test)Foo.test(124)
f = Foo() #实例化一个对象
print(f.test)
print(Foo.test)

结果:
bound method Foo.test of <class 'main.Foo'>>
bound method Foo.test of <class 'main.Foo'>>

打印的的都是类的绑定方法,
即便是实例一个对象,f.test(123) 也是使用的类的绑定方法

获得了类的内存地址,加括号就能实例化

str

定义在类的内部,必须返回一个字符串类型
什么时候出发执行?打印这个类的对象时,会出发执行
class People:
def init(self,name,age):
self.name=name
self.age = age

def __str__(self):return 'name:%s,age:%s' %(self.name,self.age)

p1=People("aa",18)
print(p1)

应用场景

import time
class Date:def __init__(self,year,month,day):self.year = yearself.month = monthself.day = day@staticmethoddef now():t = time.localtime()obj = Date(t.tm_year,t.tm_mon,t.tm_mday)return obj@staticmethoddef tomorrow():t1 = time.localtime(time.time()+86400)obj = Date(t1.tm_year, t1.tm_mon, t1.tm_mday)return obj
class EuropeDate(Date): # 定义一个子类类继承passe1 = EuropeDate.now()  # 实例化
print(e1)  # 打印这个实例化的对象的时候仍然是Date的对象

结果:
main.Date object at 0x0000000002330B38>

也就是说自己儿子确实别人的

解决方案

import time
class Date:def __init__(self,year,month,day):self.year = yearself.month = monthself.day = day@classmethoddef now(cls):print(cls)   # 打印一下,测试传入的类是t = time.localtime()obj = Date(t.tm_year,t.tm_mon,t.tm_mday)return obj@classmethoddef tomorrow(cls):t1 = time.localtime(time.time()+86400)obj = Date(t1.tm_year, t1.tm_mon, t1.tm_mday)return obj
class EuropeDate(Date): # 定义一个子类类继承def __str__(self):return 'year:%s,month:%s,day:%s' %(self.year,self.month,self.day)e1 = EuropeDate.now()  #

通过测试,此时打印的的类是Europe
class 'main.EuropeDate'>

终极版:

import time
class Date:def __init__(self,year,month,day):self.year = yearself.month = monthself.day = day@classmethoddef now(cls):print(cls)   # 打印一下,测试传入的类是t = time.localtime()obj = cls(t.tm_year,t.tm_mon,t.tm_mday)  return obj@classmethoddef tomorrow(cls):t1 = time.localtime(time.time()+86400)obj = cls(t1.tm_year, t1.tm_mon, t1.tm_mday)return obj
class EuropeDate(Date): # 定义一个子类类继承def __str__(self):return 'year:%s,month:%s,day:%s' %(self.year,self.month,self.day)e1 = EuropeDate.now()  #
print(e1)

结果是:
class 'main.EuropeDate'>
year:2017,month:4,day:23

在程序中改的是
obj = cls(t.tm_year,t.tm_mon,t.tm_mday) ,这是用子类实例化

引入cls就是谁来调用,谁就执行

转载于:https://www.cnblogs.com/Python666/p/6750508.html

Python静态方法 类方法相关推荐

  1. python 静态方法 类方法 的作用_Python实例方法、类方法、静态方法的区别与作用详解...

    本文实例讲述了Python实例方法.类方法.静态方法的区别与作用.分享给大家供大家参考,具体如下: Python中至少有三种比较常见的方法类型,即实例方法,类方法.静态方法.它们是如何定义的呢?如何调 ...

  2. Python 静态方法 类方法

    静态方法和实例方法的区别主要体现在两个方面: 1. 在外部调用静态方法时,可以使用"类名.方法名"的方式,也可以使用"对象名.方法名"的方式.而实例方法只有后面 ...

  3. Python 实例方法,类方法和静态方法的区别

    在 Python 中,实例方法(instance method),类方法(class method)与静态方法(static method)经常容易混淆.本文通过代码例子来说明它们的区别. 1.实例方 ...

  4. python静态方法可以被继承吗_python 类的继承 实例方法.静态方法.类方法的代码解析...

    这篇文章主要介绍了python 类的继承 实例方法.静态方法.类方法的代码解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 dt={} class ...

  5. python静态方法,类方法,属性方法,实例方法

    DAY 3. 静态方法,类方法,属性方法,实例方法 有四种方法,实例方法,类方法,静态方法,属性方法 实例方法 实例方法的第一个参数是self,他会指向类的实例化对象,只能被对象调用,如 class ...

  6. python 静态方法_Python编程思想(25):方法深度解析

    -----------支持作者请转发本文-----------李宁老师已经在「极客起源」 微信公众号推出<Python编程思想>电子书,囊括了Python的核心技术,以及Python的主要 ...

  7. python静态方法_Python静态方法

    python静态方法 Python静态方法 (Python static method) In this quick post, we will learn how to create and use ...

  8. 类的实例方法静态方法类方法属性方法属性

    目录: 分类 实例方法 静态方法 类方法 属性方法 属性 分类: 按照调用方式可以分为3种,实例方法.静态方法.和类方法 实例方法 实例方法只能通过实例对象调用,不能通过类进行调用.实例方法再定义时候 ...

  9. Python静态方法

    Python静态方法 什么是静态方法?静态方法是干什么的?在Python里面静态方法和我们平时写的函数def是一样的.唯一不同之处就是它可以存在于类中,不同实例化类也可以调用.话不多说,通过例题看一下 ...

最新文章

  1. java 构建是什么意思_构建的概念
  2. 我很欣慰,Vista下终于能用rose了
  3. AppCompatActivity与toolbar的结合
  4. java数据类型指定长度_判断(2分) Java的各种数据类型占用固定长度,与具体的软硬件平台环境无关...
  5. 计算机操作业务知识题库,《计算机操作基础知识题库》.doc
  6. 解决webview调用 goBack() 返回上一页自动刷新闪白的情况
  7. python request库_【Python爬虫】Request库入门
  8. python 常用的几个镜像源
  9. 制作单机俄罗斯方块游戏总结(一)
  10. 数组中常用几种的Arrays方法
  11. 求求你学学医疗保险小知识吧
  12. Milvus带你实现轻松搭建以图搜图系统
  13. kubernetes中Pod容器错误 init:ImagePullBackOff 解决方法
  14. 计算机应用基础评价内容,计算机应用基础教学中过程性评价的研究
  15. Excel 锁定特定单元格 不允许更改
  16. 手机客户端设置同济邮箱的方法
  17. 超详细:将iPhone中音乐导出到电脑里的简单方法(完美支持最新iOS15.2系统)
  18. 如何理解最大似然估计?
  19. VR热播:VR 剧集以及及大量精彩VR视频
  20. 模具腐蚀皮纹工艺原理及其流程

热门文章

  1. setInterval 和$interval的区别
  2. Flask报错RuntimeError: No application found. Either work inside a view function or push an applicatiio
  3. bzoj 3375: [Usaco2004 Mar]Paranoid Cows 发疯的奶牛(二分)
  4. 二分最大匹配(匈牙利算法+HK算法)
  5. 设置mybb论坛后台显示为中文
  6. C语言创建顺序表并插入元素 详细注释
  7. airflow+k8s 多用户-分布式-跨集群-容器化调度
  8. 通过helm在k8s上部署spark(伪集群版)
  9. matlab2c使用c++实现matlab函数系列教程-binopdf函数
  10. matlab2c使用c++实现matlab函数系列教程-blkdiag函数