`
szhnet
  • 浏览: 109659 次
  • 性别: 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++编程技巧。在实际项目中,这样的函数可以集成到更复杂的...

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

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

    装函数和驱动函数

    本文将详细介绍桩函数和驱动函数的概念、作用和使用方法,并通过一个实际的例子来演示如何使用桩函数和驱动函数来实现单元测试。 桩函数(Stub) 桩函数是一种特殊的函数,它可以模拟真实函数的行为,以便在测试中...

    模拟函数发生器的制作方法及有关理论

    《模拟函数发生器的制作方法及有关理论》 在电子技术领域,函数发生器是一种重要的设备,用于产生不同类型的电信号,如正弦波、矩形波和三角波,广泛应用于无线电通信、测量和自动化控制等领域。本文主要探讨了如何...

    200、200smartPLC模拟量转化函数

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

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

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

    模拟退火算法.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:模拟退火算法解决多元函数求最优值(最大值或最大值)

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

Global site tag (gtag.js) - Google Analytics