英文原文: https://julien.danjou.info/blog/2013/guide-python-static-class-abstract-methods

翻译出处: http://python.jobbole.com/81595/

一、How methods work in Python

方法就是一个函数、以类的属性被存储。可以通过如下的形式进行声明和访问:In [1]: class Pizza(object):

...: def __init__(self,size):

...: self.size = size

...: def get_size(self):

...: return self.size

...:

In [2]: Pizza.get_size

Out[2]:

以上的执行结果告诉我们,类Pizza 的属性get_size 是一个未绑定的方法。是什么意思呢? 将在下面的尝试得到答案。In [3]: Pizza.get_size()

---------------------------------------------------------------------------

TypeError Traceback (most recent call last)

in ()

----> 1 Pizza.get_size()

TypeError: unbound method get_size() must be called with Pizza instance as first argument (got nothing instead)

上面的结果告诉我们,想要调用类Pizza的属性get_size,需要一个Pizza 的实例。而从get_size 的方法中也可以看出,第一个参数为一个Pizza的实例In [4]: Pizza.get_size(Pizza(42))

Out[4]: 42

OK,以上我们可以真正的去使用类Pizza 的属性get_size 了。 而现实生活中,我们通常这样使用:In [5]: pizza = Pizza(42) # 声明一个Pizza 的实例

In [6]: pizza.get_size() # 通过声明的实例pizza 调用 get_size 方法

Out[6]: 42

二、Static methods

什么时静态方法? 我感觉还是英文原汁原味的更地道

Static methods are a special case of methods. Sometimes, you'll write code that belongs to a class, but that doesn't use the object itself at all.

静态方法是一类特殊的方法。有时,你想写一些属于类的代码,但又不会去使用和这个类任何相关的东西。

Example:In [1]: class Pizza(object):

...: @staticmethod

...: def mix_ingredients(x,y):

...: return x + y

...: def cook(self):

...: return self.mix_ingredients(self.cheese,self.vegetables)

在以上的例子中,书写一个非静态的方法同样也可以工作。但是需要对函数mix_ingredients 传递一个self 参数,但这个参数时完全使用不到的。在这里使用到了装饰器 @staticmethod 。它给我们带来了

如下的几点好处:

Python 可以直接使用静态方法,而避免了去实例化一个对象。实例化对象需要消耗资源的,静态方法避免了这一切。

可读性更好了,看到@staticmethod 后,我们就可以知道此方法是对立的,不需要依赖类的实例。In [3]: Pizza().cook is Pizza().cook

Out[3]: False

In [4]: Pizza().mix_ingredients is Pizza.mix_ingredients

Out[4]: True

In [5]: Pizza().mix_ingredients is Pizza().mix_ingredients

Out[5]: True

In [6]:

从上面的执行结果也可以看出,静态方法即可以被类调用,同样类的实例也可以调用,只是这样会耗用更多的资源而已(看起来不专业。哈哈)

三、Class methods

what are class methods? Class methods are methods that are not bound to an object, but to… a class!

什么时类方法,类方法不是绑定到类的实例上去的,而是绑定到类上去的.In [1]: class Pizza(object):

...: radius = 42

...: @classmethod

...: def get_radius(cls):

...: return cls.radius

...:

In [2]: Pizza.get_radius

Out[2]: >

In [3]: Pizza().get_radius

Out[3]: >

In [4]: Pizza.get_radius()

Out[4]: 42

无论什么情况下,get_radius 都是绑定到 类 Pizza 上的。

那这个类方法,到底有什么用呢? 我们在什么时候才会去用它呢? 我想这才是我想去关心的。

(1)、工厂方法:它用于创建类的实例,例如一些预处理。如果使用@staticmethod代替,那我们不得不硬编码Pizza类名在函数中,这使得任何继承Pizza的类都不能使用我们这个工厂方法给它自己用。class Pizza(object):

def __init__(self, ingredients):

self.ingredients = ingredients

@classmethod

def from_fridge(cls, fridge):

return cls(fridge.get_cheese() + fridge.get_vegetables())

(2)、调用静态类:如果你把一个静态方法拆分成多个静态方法,除非你使用类方法,否则你还是得硬编码类名。使用这种方式声明方法,Pizza类名明永远都不会在被直接引用,继承和方法覆盖都可以完美的工作。class Pizza(object):

def __init__(self, radius, height):

self.radius = radius

self.height = height

@staticmethod

def compute_area(radius):

return math.pi * (radius ** 2)

@classmethod

def compute_volume(cls, height, radius):

return height * cls.compute_area(radius)

def get_volume(self):

return self.compute_volume(self.height, self.radius)

python类方法和静态方法_Python 中的方法、静态方法(static method)和类方法(class method)...相关推荐

  1. python isnumeric函数用法_Python中isnumeric()方法的使用简介

    Python中isnumeric()方法的使用简介 更新时间:2015年05月19日 09:35:06 投稿:goldensun 这篇文章主要介绍了Python中isnumeric()方法的使用,is ...

  2. python算法和数据结构_Python中的数据结构和算法

    python算法和数据结构 To 至 Leonardo da Vinci 达芬奇(Leonardo da Vinci) 介绍 (Introduction) The purpose of this ar ...

  3. python装饰器类-Python 装饰器装饰类中的方法

    title: Python 装饰器装饰类中的方法 comments: true date: 2017-04-17 20:44:31 tags: ['Python', 'Decorate'] categ ...

  4. python装饰器实例-基于Python 装饰器装饰类中的方法实例

    title: Python 装饰器装饰类中的方法 comments: true date: 2017-04-17 20:44:31 tags: ['Python', 'Decorate'] categ ...

  5. python装饰器特性iy雾_扣丁学堂简述Python 装饰器装饰类中的方法

    扣丁学堂简述 Python 装饰器装饰类中的方法 本篇文章小编主要和读者们分享一下 Python 装饰器装饰类中的方法, 文中会有详细的代码 列出供大家参考,下面随小编一起来了解一下吧. 有一个类 T ...

  6. python 实例方法和类方法的区别_python中实例方法,类方法和静态方法的区别。...

    实例方法,必须要创建实例才能调用,里面有self关键字,有初始化函数必须对初始化函数进行传参. 类方法,可以直接类名.方法名直接调用,也可以创建实例调用.里面有cls关键字,调用时,直接类名.方法名, ...

  7. python获取方法的装饰方法_python中的方法和装饰器

    [TOC] 装饰器 python中的装饰器(decorator)是在pep 318中被首次引入,它的本质是一个函数这个函数是接受其它参数为参数,并且用一个新的,修改后的函数作为替换,最常见的装饰器就c ...

  8. python类方法是什么_python中什么是类方法

    Python中的类方法,指的是在类中定义的函数,函数在类的内部称为方法,变量在类的内部,称为属性. Python类方法和静态方法都可以被类和类实例调用,类实例方法仅可以被类实例调用.类方法的隐含调用参 ...

  9. python中 普通方法_python中普通方法classmethod和staticmethod的区别与用法

    class Foo(object): #实例方法,第一个承诺书必须是实例对象,一般习惯用self. def ins_m(self): print("是类{}的实例方法,只能被实例调用&quo ...

  10. python怎么显示结果_python中plot实现即时数据动态显示方法

    在Matlab使用Plot函数实现数据动态显示方法总结中介绍了两种实现即时数据动态显示的方法.考虑到使用python的人群日益增多,再加上本人最近想使用python动态显示即时的数据,网上方法很少,固 ...

最新文章

  1. (0107)iOS开发之UI实时调试InjectionIII的使用
  2. 【数字信号处理】基本序列傅里叶变换总结 ( 单位脉冲序列 δ(n) | {1} 序列 | e^jωn 序列 | cosωn 序列 | sinωn 序列 | a^nu(n) | 矩形窗函数 ) ★★★
  3. 《Unreal Engine 4蓝图可视化编程》一1.6 改变目标方向
  4. golang的定时器NewTimer、NewTicker使用
  5. 一些javascript免费中文书籍
  6. 1个价值80亿美元的iPod
  7. 如何在阿里云上运行SAP UI5应用
  8. css 控制图片最大宽度
  9. 手动制作python安装模块
  10. 国产手机的安全漏洞或比勒索病毒还可怕?
  11. Windows RC、CTP、RTM、OEM、RTL、VOL等版本区别
  12. centos下安装VMware Server
  13. 2021-10-18word2vec训练过程
  14. 。成功实现avd 模拟器 与pc 虚拟串口实现通信 通过多方文章综合
  15. wd移动硬盘不能识别_WD移动硬盘读不出来了
  16. 笔记本计算机被限制无法上网,电脑上网受限制或无法连接怎么办 电脑上网受限制或无法连接的解决方法...
  17. 使用Fontcreator字体制作软件及字体设计学习
  18. BlendMask知识点记录
  19. 图像处理的Dither和Banding
  20. egret内存泄漏整理学习

热门文章

  1. F - Restoring the Expression CodeForces - 898F
  2. bzoj 4537: [Hnoi2016]最小公倍数 分块+并查集
  3. 在单例Bean中依赖原型Bean问题解决
  4. Java 虚拟机简介
  5. 干掉visio,这个画图神器太香了
  6. 现代浏览器探秘(part 1):架构
  7. the art of seo(chapter seven)
  8. Android网络编程4之从源码解析Volley
  9. 关于mysql数据库在输入password后,滴的一声直接退出界面的解决的方法(具体办法)...
  10. Oracle等待事件之Enqueue(锁)