传送门

  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. java基础之 类型转换

    一.自动类型转换 1.java中不同类型的数据在计算时,为保证数据的精度,数据的类型会以大容量的类型为主: 2.自动类型转换的排序: char.byte.short -> int -> l ...

  2. oracle查询第几行到第几行的数据

    我想查询10条到20条的数据 注意: 1.大数在前,小数在后面 2.都是小于 () minus (); 运行结果:

  3. 5.Mybatis--解决属性名和字段名不一致的问题(起别名+resultMap)

    我们看一下数据库中的字段 新建一个项目(我们拷贝之前的)来测试实体类字段跟数据库不一致  看看看,实体类中的属性是不是跟数据库表中的名不一样了 好,我们查询一下: 出现问题了:空值 为什么为空? 因为 ...

  4. MySQL学习(七) 索引选择(半原创)

    概述 该篇文章主要阐述一个例子(例子来自参考资料,侵删),然后总结今天相关的知识点. 例子 (例子来自参考文章,非原创) 创建表并插入数据,并执行查询 CREATE TABLE `t` ( `id` ...

  5. centos6 源码编译安装nginx 1.6 教程 nginx安装脚本

    操作系统centos 6.9 安装nginx需要pcre zlib openssl的库,下文都是在官网直接下载用作编译安装 该nginx安装教程,有安装maxmind IP 库 该教材有修改最大打开文 ...

  6. vs2017运行网站,代码停止,浏览器页面关闭问题解决

    问题描述: 在项目开发过程中,如果程序出现了异常,我们一般都会暴露在浏览器中,但是最近我使用vs2017,发现项目一旦停止,浏览器也自动关闭了,没法查看具体错误详情(当然除了单步调试什么的),很是不爽 ...

  7. web开发中 前端模板->JavaScript->Controller->JavaScript相应 的交互方式

    首先画张图了解当下流行的phpweb 数据交互套路: 1,模板与JavaScript的交互 给HTML标签赋予onlick事件,点击后触发js方法,jQuery收集页面信息,分析信息. 2,js与co ...

  8. iptables详解(3):增删改存

    总结一下iptables规则管理的增删改存命令: 1.添加规则: 1)在指定表的指定链的末尾添加一条规则,-A选项表示在末尾添加,-j表示采取的动作,例如DROP.REJECT.ACCEPT 命令语法 ...

  9. quernation,euler,rotationmatrix之间的相互转换

    转自:https://blog.csdn.net/zhuoyueljl/article/details/70789472

  10. C# 篇基础知识9——特性、程序集和反射

    特性(Attribute)是用于为程序元素添加额外信息的一种机制.比如记录文件修改时间或代码作者.提示某方法已经过期.描述如何序列化数据等等.方法.变量.属性.类.接口.结构体以及程序集等都是程序元素 ...