给python类动态添加方法(method)

群里有人问如何做到

def foo():
    pass

class Bar(object):
    pass

Bar.set_instance_method(foo)

b = Bar()
b.foo()

这个其实还是比较简单的, 只要写个函数给类设置属性即可, 可根据需求是否用函数包装下, 或者用staticmethod这个decorator:

import functools

def foo():
    print ‘hello world‘

class Bar(object):
    def __init__(self):
        self.data = 42

    @classmethod
    def set_instance_method(cls, func):
        @functools.wraps(func)
        def dummy(self, *args, **kwargs):
            func(*args, **kwargs)
        setattr(cls, func.func_name, dummy)

Bar.set_instance_method(foo)

b = Bar()
b.foo()
print b.foo
print Bar.foo

输出

hello world
<bound method Bar.foo of <__main__.Bar object at 0x10d41c890>>
<unbound method Bar.foo>

然后又问如果要这样做怎么写:

def foo():
    pass

class Bar(object):
    set_instance_method(foo)

这样问题就在于set_instance_method运行时如何获得类(Bar), 无奈, 尝试了下,最多也只能得到"Bar"(通过inspect模块).
不是很熟悉python内部原理, 只知道在Bar定义时Bar并不存在, 所以无法这么做.

不过不太清楚问问题的人思路是怎么样的, 如果纯粹是为了研究倒也还好.
如果把代码写成这样, 觉得没什么太多好处, 再加上可能增加了维护成本, 导致维护的人找不到函数的定义.

再者, 你让IDE怎么办.基本只能跑一遍代码才能正确解析了....

给python类动态添加方法(method)

时间: 2024-08-06 03:34:23

给python类动态添加方法(method)的相关文章

使用runtime给类动态添加方法并调用 - class_addMethod

上手开发 iOS 一段时间后,我发现并不能只着眼于完成需求,利用闲暇之余多研究其他的开发技巧,才能在有限时间内提升自己水平.当然,“其他开发技巧”这个命题对于任何一个开发领域都感觉不找边际,而对于我来说,尝试接触 objc/runtime 不失为是开始深入探索 iOS 开发的第一步. 刚了解 runtime 当然要从比较简单的 api 开始,今天就罗列整理一下 class_addMethod 的相关点: 首先从文档开始. /** * Adds a new method to a class wi

给模型类动态添加方法

想要在每个类上加个方法或者property,一种可以每个类下加,另一种如下 def get_test(self): return 1 from django.contrib.contenttypes.models import ContentType model_list = ['CommonSite'] # 或者也可以直接传类对象,下面就不用ContentType了 for obj in model_list: # ContentType.objects.get(model=obj).mode

Runtime(动态添加方法)

A问:  有没有使用过performSelector,什么时候使用?动态添加方法的时候使用过?怎么动态添加方法?用runtime?为什么要动态添加方法? B:Runtime(动态添加方法):OC都是懒加载机制,只要一个方法实现了,就会马上添加到方法列表中. app:免费版,收费版 QQ,微博,直播等等应用,都有会员机制 // 任何方法默认都有两个隐式参数,self,_cmd // 什么时候调用:只要一个对象调用了一个未实现的方法就会调用这个方法,进行处理 // 作用:动态添加方法,处理未实现 +

使用TypeDescriptor给类动态添加Attribute【转】

源文 : http://www.cnblogs.com/bicker/p/3326763.html 给类动态添加Attribute一直是我想要解决的问题,从msdn里找了很久,到Stack Overflow看了不少文章,算是最终有了答案. 先是有这样的一段解释 Attributes are static metadata. Assemblies, modules, types, members, parameters, and return values aren't first-class o

在类中添加方法和成员变量

在前面我们也了解到了Java语言的最小单位是类.在C语言中有着全局变量,在Java中也有. 在Java中添加全局变量(成员变量)是由三大部分组成的:访问修饰符.数据类型和成员变量. 而访问修饰符有这几种:public .private.protected或者不写(这种将使用默认访问修饰符). 我们在引用对象时,必须对其进行初始化,否则将会报错.如果我们不自己去初始化值,那马那么 电脑回自己默认初始值:0.0.0.null.false.空字符. 在Java类中添加方法也是由:访问修饰符.返回值.方

细说python类2——类动态添加方法和slots(转)

先说一下类添加属性方法和实例添加属性和方法的区别, 类添加属性属于加了一个以类为全局的属性(据说叫静态属性),那么以后类的每一个实例化,都具有这个属性.给类加一个方法也如此,以后类的每一个实例化都具备这个方法(但是据说叫动态方法.)但是给实例加一个属性,作用域就是这个实例,是与类没关系的(据说这种属性叫动态属性). Python类的实例可以动态的添加属性.举个例子,声明一个类A >>> class A(object):...   def __init__(self):...     pr

python 面向对象六 动态添加方法 __slots__限制动态添加方法

一.动态添加属性 1 >>> class Student(object): 2 pass 3 4 >>> st = Student() 5 >>> st.name = 'Jack' 6 >>> st.name 7 'Jack' 二.动态给实例添加方法 1 >>> from types import MethodType 2 >>> class Student(object): 3 pass 4 5

全面解析python类的绑定方法与非绑定方法

类中的方法有两类: 绑定方法 非绑定方法 一.绑定方法 1.对象的绑定方法 首先我们明确一个知识点,凡是类中的方法或函数,默认情况下都是绑定给对象使用的.下面,我们通过实例,来慢慢解析绑定方法的应用. class People: def __init__(self,name,age): self.name = name self.age = age def talk(self): pass p = People('xiaohua',18) print(p.talk) 输出结果: <bound m

Python 类的魔术方法

Python中类的魔术方法 在Python中以两个下划线开头的方法,__init__.__str__.__doc__.__new__等,被称为"魔术方法"(Magic methods).魔术方法在类或对象的某些事件出发后会自动执行,如果希望根据自己的程序定制自己特殊功能的类,那么就需要对这些方法进行重写. 注意:Python 将所有以 __(两个下划线)开头的类方法保留为魔术方法.所以在定义类方法时,除了上述魔术方法,建议不要以 __ 为前缀. Python提供的魔术方法 魔术方法这里