`
szhnet
  • 浏览: 109876 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

模拟函数和方法的实现

阅读更多
我们知道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窗模拟正态函数MATLAB实现

    本项目通过MATLAB实现Parzen窗模拟正态函数,旨在让学生掌握这种技术的基本原理和应用。 首先,我们要理解Parzen窗的基本概念。Parzen窗方法是通过在数据点周围放置一个窗口(通常是高斯窗口,即正态分布),然后对...

    阿克曼函数非递归实现

    这个函数是不可计算的,也就是说,它不能通过有限步骤的算法来解决,但是可以通过其他方法如迭代或堆栈来模拟其计算过程。 阿克曼函数通常定义为三个参数的函数A(m, n, p),其中m、n、p是非负整数。它的基本形式...

    用Qt使用按键模拟函数和鼠标模拟函数实现网页刷新 示例 demo

    Qt使用鼠标模拟函数mouse_event和按键模拟函数keybd_even实现网页刷新功能 https://blog.csdn.net/qq_29542611/article/details/83421552

    模拟退火实现函数最大值

    模拟退火算法是一种启发式搜索方法,源自固体物理中的退火过程,被广泛应用于解决优化问题,特别是寻找全局最优解。在本主题中,我们将详细探讨如何使用模拟退火算法来寻找函数的最大值。 首先,我们需要理解模拟...

    ackermann函数的递归实现和非递归实现

    堆栈允许我们模拟函数调用的“返回”行为,而无需实际的递归调用。此外,堆栈的插入和删除操作通常比其他数据结构(如队列)更快,这对于处理大量计算的高阶阿克曼函数很有帮助。 ### 计算复杂性 阿克曼函数的增长...

    模拟函数信号发生器说明

    《模拟函数信号发生器》 在工科教育中,模拟函数信号发生器是不可或缺的工具,尤其对于信息与控制工程学院的学生来说,它能够帮助学生深入理解正弦波、三角波、矩形波等基本信号的产生原理。本文将重点讨论使用ICL ...

    势函数的matlab实现

    总结,MATLAB为实现和研究势函数提供了丰富的工具和功能。通过定义势函数、绘图、数值计算以及模拟,我们可以深入理解这些概念并将其应用于实际问题中。无论是基础的物理学分析,还是复杂的工程计算,MATLAB都是一个...

    Matlab中unwrap函数C代码实现

    总结起来,`unwrap`函数在C/C++中的实现需要理解其核心逻辑,即检测和修正相位跳跃。通过编写这样的代码,我们可以加深对周期性相位处理的理解,同时锻炼C/C++编程技巧。在实际项目中,这样的函数可以集成到更复杂的...

    200、200smartPLC模拟量转化函数

    6. **库函数的使用**:掌握如何在程序中引入和调用库文件中的函数,理解每个函数的功能和使用方法。 通过深入理解和实践这些知识点,用户可以更好地利用S7-200 SMART PLC的模拟量处理功能,完成复杂的工业自动化...

    函数信号发生器模拟电路课程设计.DOC

    电路设计方案设计部分详细介绍了电路设计的原理和方法,包括方波发生电路、方波—三角波转换电路、三角波—正弦波转换电路等。 电路仿真部分使用了相应的仿真软件对电路进行了仿真,仿真结果表明了电路的正确性和...

    使用模拟退火算法求函数的最小值

    总之,通过MATLAB自编程实现模拟退火算法求解函数最小值,不仅可以加深对算法的理解,还能锻炼编程和问题解决能力。实验过程中,通过对参数的调整和观察,我们可以更好地掌握模拟退火算法的工作机制,进一步提升优化...

    模拟退火算法.zip_MATLAB 模拟退火算法 一元函数_liemtt_simpleo2t_多元函数优化_模拟退火

    `liemtt`和`simpleo2t`可能是两种不同的实现方式或者优化策略,可能分别对应一元函数和多元函数的优化方法。`liemtt`可能是一个作者的缩写,而`simpleo2t`可能是算法的一种特定版本或特定优化任务的简写。 在使用...

    C语言模拟猜数字游戏程序(函数整体实现全部)

    C语言模拟猜数字游戏程序(函数整体实现全部)。

    matlab开发-计数过程和分段恒定函数的模拟

    在MATLAB环境中,计数过程和分段恒定函数的模拟是两个重要的概念,它们广泛应用于数据分析、系统建模...实际应用中,我们需要结合具体的业务场景和数学模型,灵活运用MATLAB的各种工具和函数,以实现精确的模拟和分析。

    5个string函数的模拟实现

    5个strnig函数的模拟实现

    chapter7.rar_模拟退火_模拟退火 matlab_适应度函数

    总结来说,模拟退火算法是一种灵活且强大的全局优化方法,其在MATLAB中的实现可以通过调整参数和适应度函数来适应各种优化问题。通过分析SA71.m和SA72.m,我们可以深入理解算法的运行机制,并结合图形化结果,如适应...

    python:模拟退火算法解决多元函数求最优值(最大值或最大值)

    利用模拟退火算法实现解决多元函数(一元函数)最优值问题(单目标问题),读者根据代码修改测试函数,不管是一元还是多元,都可以解决其最优话问题。

    样条插值函数 matlab的spline函数的c语言实现版 支持3点及以上插值 效果超好

    样条插值函数 matlab的spline函数的c语言实现版 支持3点及以上插值 效果超好

Global site tag (gtag.js) - Google Analytics