python __call__ 可调用对象

来源:互联网 发布:网络爸爸 下载 编辑:程序博客网 时间:2024/06/05 08:25
原文链接
__call__

Python中有一个有趣的语法,只要定义类型的时候,实现__call__函数,这个类型就成为可调用的。

换句话说,我们可以把这个类型的对象当作函数来使用,相当于 重载了括号运算符。

例如,现在我们要计算重力环境下的自然落体位移。我们知道Sy=(gt**2)/2,那么,我们可以建立一个函数:

def g_dpm(t):

return (9.8*t**2)/2

我们都知道,地球表面的重力加速度约等于9.8m/s**2,这个函数实在没什么技术含量。

慢,头儿说了,我要算的是火星啊¥%#

呃……你能说人家无理取闹么?EAFIFA足球里,我还见过微重力模式的球场,总之,在计算机程序里,很多超现实的需求都有可能。

恩,最简单的办法当然是:

def mar_g_dpm(t):

return (3.92*t**2)/2 #火星表面的重力加速度约等于地球表面的2/5

不过,你真的能保证下次那个可爱的策划不会再设计一个金星场 景?或者木星?或者该死的大魔导师行会开始出售新的魔法卷轴——重力操控?

当然,我们可以这样设计这个函数:

def g_dpm(g, t):

return (g*t**2)/2

但是g相对于t,是一 个稳定得多的数量,基本上,在一次相关运算中,g可以当作常 量。那么,一个可调用对象也许更适合。下面定义这样一个类型:

class g_dpm(object):

def __init__(self, g):

self.g = g

def __call__(self, t):

return (self.g*t**2)/2

计算地球场景的时候,我们就可以令e_dpm = g_dpm(9.8)s = e_dpm(t)。同样的方式,可以很容易的生成其他重力环境下的 自由落地公式

原创粉丝点击