传送门

  1. https://github.com/jackfrued/Python-100-Days/blob/master/Day01-15/Day09/面向对象进阶.md#静态方法和类方法

静态方法@staticmethod

  1. 记得在Fluent Python中大神讲过@staticmethod和普通的函数没什么两样;但是在以下的例子中可以看到,@staticmethod意义在于,这个静态方法和这个类是相关的(虽然这个类的实例对象能调用),但是一般这样设计是给类调用的。
  2. 例子: 我们定义一个“三角形”类,通过传入三条边长来构造三角形,并提供计算周长和面积的方法,但是传入的三条边长未必能构造出三角形对象,因此我们可以先写一个方法来验证三条边长是否可以构成三角形,**这个方法很显然就不是对象方法**,因为在调用这个方法时三角形对象尚未创建出来(因为都不知道三条边能不能构成三角形),所以**这个方法是属于三角形类而并不属于三角形对象的**。我们可以使用静态方法来解决这类问题,代码如下所示。
from math import sqrt

class Triangle(object):

    def __init__(self, a, b, c):
self._a = a
self._b = b
self._c = c @staticmethod
def is_valid(a, b, c):
return a + b > c and b + c > a and a + c > b # 求周长
def perimeter(self):
return self._a + self._b + self._c # 求面积
def area(self):
# 海伦公式
half = self.perimeter() / 2
return sqrt(half * (half - self._a) *
(half - self._b) * (half - self._c)) def main():
a, b, c = 3, 4, 5
# 静态方法和类方法都是通过给类发消息来调用的
if Triangle.is_valid(a, b, c):
t = Triangle(a, b, c)
print(t.perimeter())
# 也可以通过给类发消息来调用对象方法但是要传入接收消息的对象作为参数
# print(Triangle.perimeter(t))
print(t.area())
# print(Triangle.area(t))
else:
print('无法构成三角形.') if __name__ == '__main__':
main()

类方法@classmethod

  1. 和静态方法比较类似,Python还可以在类中定义类方法,类方法的第一个参数约定名(convention)为cls,它代表的是当前类相关的信息的对象(类本身也是一个对象,有的地方也称之为类的元数据对象),通过这个参数我们可以获取和类相关的信息并且可以创建出类的对象(在@classmethod修饰的函数中return cls()),代码如下所示。
from time import time, localtime, sleep

class Clock(object):
"""数字时钟""" def __init__(self, hour=0, minute=0, second=0):
self._hour = hour
self._minute = minute
self._second = second @classmethod
def now(cls):
current_time = localtime(time())
return cls(current_time.tm_hour, current_time.tm_min, current_time.tm_sec) def run(self):
"""走字"""
self._second += 1
if self._second == 60:
self._second = 0
self._minute += 1
if self._minute == 60:
self._minute = 0
self._hour += 1
if self._hour == 24:
self._hour = 0 def show(self):
"""显示时间"""
return '%02d:%02d:%02d' % \
(self._hour, self._minute, self._second) def main():
# 通过类方法创建对象并获取系统时间
clock = Clock.now()
while True:
print(clock.show())
sleep(1)
clock.run() if __name__ == '__main__':
main()

@staticmethod 和 @classmethod

class Demo():

    @classmethod
def klassmeth(cls, *args):
return args @staticmethod
def statmeth(*args):
return args # 不加cls,退化成@staticmethod
print(Demo.klassmeth()) # ()
print(Demo.klassmeth('spam')) # () print(Demo.klassmeth(Demo,)) # (<class '__main__.Demo'>,)
print(Demo.klassmeth(Demo, 'spam')) # (<class '__main__.Demo'>, 'spam') print(Demo.statmeth()) # ()
print(Demo.statmeth('spam')) # ('spam',)

Python - 静态方法@staticmethod和类方法classmethod的更多相关文章

  1. 静态方法staticmethod和类方法classmethod

    静态方法staticmethod和类方法classmethod 一.类方法classmethod 把一个方法变成一个类中的方法,这个方法可以直接利用类来调用,不需要依托任何的对象,即不需要实例化也可以 ...

  2. python-静态方法staticmethod、类方法classmethod、属性方法property

    Python的方法主要有3个,即静态方法(staticmethod),类方法(classmethod)和实例方法 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 def  ...

  3. python中静态方法(@staticmethod)和类方法(@classmethod)的区别

    一般来说,要使用某个类的方法,需要先实例化一个对象再调用方法. 而使用@staticmethod或@classmethod,就可以不需要实例化,直接类名.方法名()来调用. 这有利于组织代码,把某些应 ...

  4. 【面试必问】python实例方法、类方法@classmethod、静态方法@staticmethod和属性方法@property区别

    [面试必问]python实例方法.类方法@classmethod.静态方法@staticmethod和属性方法@property区别 1.#类方法@classmethod,只能访问类变量,不能访问实例 ...

  5. Python的3个方法:静态方法(staticmethod),类方法(classmethod)和实例方法

    Python的方法主要有3个,即静态方法(staticmethod),类方法(classmethod)和实例方法,如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 ...

  6. Python静态方法(staticmethod)和类方法(classmthod)

    Python静态方法(staticmethod)和类方法(classmthod)翻了翻之前的笔记,也刚好看到一篇不错的blog,关于静态方法和类方法的,方便以后查阅,就写在这里了,废话不多说,直接上代 ...

  7. python类方法@classmethod与@staticmethod

    目录 python类方法@classmethod与@staticmethod 一.@classmethod 介绍 语法 举例 二.@staticmethod 介绍 语法 举例 python类方法@cl ...

  8. python 静态方法、类方法(二)

    <Python静态方法.类方法>一文中曾用在类之外生成函数的方式,来计算类的实例的个数.本文将探讨用静态方法和类方法来实现此功能. 一使用静态方法统计实例 例1.static.py # - ...

  9. python中@staticmethod、@classmethod和实例方法

    1.形式上的异同点: 在形式上,Python中:实例方法必须有self,类方法用@classmethod装饰必须有cls,静态方法用@staticmethod装饰不必加cls或self,如下代码所示: ...

随机推荐

  1. Python_包

    包 包是一种通过使用‘.模块名’来组织python模块名称空间的方式. 1. 无论是import形式还是from...import形式,凡是在导入语句中(而不是在使用时)遇到带点的,都要第一时间提高警 ...

  2. C#处理不同的JSON数据

    https://blog.csdn.net/dayu9216/article/details/78465681 网络中数据传输经常是xml或者json,现在做的一个项目之前调其他系统接口都是返回的xm ...

  3. cc.Sprite 与 ccui.ImageView 改变图片

    sprite.setTexture(fileName); imageView.loadTexture(fileName);

  4. C++-LUOGU2938- [USACO09FEB]股票市场Stock Market-[完全背包]

    开O2,开O2,开O2 重要的事情说三遍 #include <set> #include <map> #include <cmath> #include <q ...

  5. 2.10 webdriver中 js 使用

    来源: 使用Webdriver执行JS小结  http://lijingshou.iteye.com/blog/2018929 selenium常用的js总结  http://www.cnblogs. ...

  6. Java 浮点数精度控制

    1.String.format​(String format,Object… args) Java中用String.format()来控制输出精度, format参数用来设置精度格式, args参数代 ...

  7. Go操作Elasticsearch

    文章转自   Elasticsearch Elasticsearch 下载 https://www.elastic.co/cn/start 运行 解压后cd到解压目录 ./bin/elasticsea ...

  8. Java数组转集合之Arrays.asList()用法

    Arrays.asList()用法 使用Arrays.asList()的原因无非是想将数组或一些元素转为集合,而你得到的集合并不一定是你想要的那个集合. 而一开始asList的设计时用于打印数组而设计 ...

  9. Java开发之Redis

    简介 Redis 是完全开源免费的,遵守 BSD 协议,是一个高性能的 key - value 数据库 Redis 与 其他 key - value 缓存产品均有以下特点: Redis 支持数据持久化 ...

  10. java把带小数点的字符串转换成int类型

    String number ="1.0000"; int num =Double.valueOf(number).intValue();//转换为Int类型