我们知道python的函数是描述符,unbound method和bound method都是instancemethod类型,是通过函数的__get__方法返回的。还有类方法classmethod也是instancemethod类型的。instancemethod用im_class,im_self和im_func保存了方法调用的相关信息。静态方法staticmethod其实返回的就是函数本身。知道了这些之后可以自己用python来做个这些函数或方法的实现。
# -*- coding:utf-8 -*- #
class FunWrap(object):
u"""包装一个函数"""
def __init__(self, func):
self.func = func
def __get__(self, obj, typ = None):
return szhinstancemethod(typ, obj, self)
def __call__(self, *args):
return self.func(*args)
def __getattr__(self, name):
return getattr(self.func, name)
class szhinstancemethod(object):
u"""模拟instancemethod"""
def __init__(self, im_class, im_self, im_func):
self.im_class = im_class
self.im_self = im_self
self.im_func = im_func
def __call__(self, *args):
if not self.im_self:
raise TypeError, "unbound method " + self.im_funcw.func_name + \
"() must be called with " + \
(self.im_class.__name__ if self.im_class else '?') + " instance"
return self.im_func(self.im_self, *args)
def __repr__(self):
if not self.im_self:
return '<unbound method ' + (self.im_class.__name__ if self.im_class else '?') \
+ "." + self.im_func.func_name + "> __szh"
else:
return '<bound method ' + (self.im_class.__name__ if self.im_class else '?') \
+ "." + self.im_func.func_name + " of " + str(self.im_self) + "> __szh"
class szhclassmethod(object):
u"""模拟classmethod"""
def __init__(self, func):
self.func = func
def __get__(self, obj, typ = None):
typ = typ or type(obj)
return szhinstancemethod(type(typ), typ, self.func)
class szhstaticmethod(object):
u"""模拟staticmethod"""
def __init__(self, func):
self.func = func
def __get__(self, obj, typ = None):
return self.func
if __name__ == '__main__':
class A(object):
@FunWrap
def f(self):
print 'test method ' + str(self)
@szhclassmethod
@FunWrap
def clsf(cls):
print 'test class method ' + str(cls)
@szhstaticmethod
@FunWrap
def staf():
print 'test static method'
a = A()
a1 = A()
print u"实例a访问方法f",a.f
print u"实例a1访问方法f",a1.f
print u"类A访问方法f",A.f
a.f()
a1.f()
print u"实例a访问类方法clasf",a.clsf
print u"类A访问类方法clasf",A.clsf
A.clsf()
a.clsf()
print u"实例a访问静态方法staf",a.staf
print u"类A访问静态方法staf",A.staf
a.staf()
分享到:
相关推荐
matlab 实现格林函数在时间域与频率域的模拟
本项目通过MATLAB实现Parzen窗模拟正态函数,旨在让学生掌握这种技术的基本原理和应用。 首先,我们要理解Parzen窗的基本概念。Parzen窗方法是通过在数据点周围放置一个窗口(通常是高斯窗口,即正态分布),然后对...
这个函数是不可计算的,也就是说,它不能通过有限步骤的算法来解决,但是可以通过其他方法如迭代或堆栈来模拟其计算过程。 阿克曼函数通常定义为三个参数的函数A(m, n, p),其中m、n、p是非负整数。它的基本形式...
Qt使用鼠标模拟函数mouse_event和按键模拟函数keybd_even实现网页刷新功能 https://blog.csdn.net/qq_29542611/article/details/83421552
模拟退火算法是一种启发式搜索方法,源自固体物理中的退火过程,被广泛应用于解决优化问题,特别是寻找全局最优解。在本主题中,我们将详细探讨如何使用模拟退火算法来寻找函数的最大值。 首先,我们需要理解模拟...
堆栈允许我们模拟函数调用的“返回”行为,而无需实际的递归调用。此外,堆栈的插入和删除操作通常比其他数据结构(如队列)更快,这对于处理大量计算的高阶阿克曼函数很有帮助。 ### 计算复杂性 阿克曼函数的增长...
《模拟函数信号发生器》 在工科教育中,模拟函数信号发生器是不可或缺的工具,尤其对于信息与控制工程学院的学生来说,它能够帮助学生深入理解正弦波、三角波、矩形波等基本信号的产生原理。本文将重点讨论使用ICL ...
总结,MATLAB为实现和研究势函数提供了丰富的工具和功能。通过定义势函数、绘图、数值计算以及模拟,我们可以深入理解这些概念并将其应用于实际问题中。无论是基础的物理学分析,还是复杂的工程计算,MATLAB都是一个...
总结起来,`unwrap`函数在C/C++中的实现需要理解其核心逻辑,即检测和修正相位跳跃。通过编写这样的代码,我们可以加深对周期性相位处理的理解,同时锻炼C/C++编程技巧。在实际项目中,这样的函数可以集成到更复杂的...
6. **库函数的使用**:掌握如何在程序中引入和调用库文件中的函数,理解每个函数的功能和使用方法。 通过深入理解和实践这些知识点,用户可以更好地利用S7-200 SMART PLC的模拟量处理功能,完成复杂的工业自动化...
电路设计方案设计部分详细介绍了电路设计的原理和方法,包括方波发生电路、方波—三角波转换电路、三角波—正弦波转换电路等。 电路仿真部分使用了相应的仿真软件对电路进行了仿真,仿真结果表明了电路的正确性和...
总之,通过MATLAB自编程实现模拟退火算法求解函数最小值,不仅可以加深对算法的理解,还能锻炼编程和问题解决能力。实验过程中,通过对参数的调整和观察,我们可以更好地掌握模拟退火算法的工作机制,进一步提升优化...
`liemtt`和`simpleo2t`可能是两种不同的实现方式或者优化策略,可能分别对应一元函数和多元函数的优化方法。`liemtt`可能是一个作者的缩写,而`simpleo2t`可能是算法的一种特定版本或特定优化任务的简写。 在使用...
C语言模拟猜数字游戏程序(函数整体实现全部)。
在MATLAB环境中,计数过程和分段恒定函数的模拟是两个重要的概念,它们广泛应用于数据分析、系统建模...实际应用中,我们需要结合具体的业务场景和数学模型,灵活运用MATLAB的各种工具和函数,以实现精确的模拟和分析。
5个strnig函数的模拟实现
总结来说,模拟退火算法是一种灵活且强大的全局优化方法,其在MATLAB中的实现可以通过调整参数和适应度函数来适应各种优化问题。通过分析SA71.m和SA72.m,我们可以深入理解算法的运行机制,并结合图形化结果,如适应...
利用模拟退火算法实现解决多元函数(一元函数)最优值问题(单目标问题),读者根据代码修改测试函数,不管是一元还是多元,都可以解决其最优话问题。
样条插值函数 matlab的spline函数的c语言实现版 支持3点及以上插值 效果超好