• python动态给对象或者类添加方法


    参考:http://stackoverflow.com/questions/972/adding-a-method-to-an-existing-object

    In Python, there is a difference between functions and bound methods.

    >>>def foo():...print"foo"...>>>class A:...def bar( self ):...print"bar"...>>> a = A()>>> foo
    <function foo at 0x00A98D70>>>> a.bar
    <bound method A.bar of <__main__.A instance at 0x00A9BC88>>>>>

    Bound methods have been "bound" (how descriptive) to an instance, and that instance will be passed as the first argument whenever the method is called.

    Callables that are attributes of a class (as opposed to an instance) are still unbound, though, so you can modify the class definition whenever you want:

    >>>def fooFighters( self ):...print"fooFighters"...>>> A.fooFighters = fooFighters
    >>> a2 = A()>>> a2.fooFighters
    <bound method A.fooFighters of <__main__.A instance at 0x00A9BEB8>>>>> a2.fooFighters()
    fooFighters

    Previously defined instances are updated as well (as long as they haven't overridden the attribute themselves):

    >>> a.fooFighters()
    fooFighters

    The problem comes when you want to attach a method to a single instance:

    >>>def barFighters( self ):...print"barFighters"...>>> a.barFighters = barFighters
    >>> a.barFighters()Traceback(most recent call last):File"<stdin>", line 1,in<module>TypeError: barFighters() takes exactly 1 argument (0 given)

    The function is not automatically bound when it's attached directly to an instance:

    >>> a.barFighters
    <function barFighters at 0x00A98EF0>

    To bind it, we can use the MethodType function in the types module:

    >>>import types
    >>> a.barFighters = types.MethodType( barFighters, a )>>> a.barFighters
    <bound method ?.barFighters of <__main__.A instance at 0x00A9BC88>>>>> a.barFighters()
    barFighters

    This time other instances of the class have not been affected:

    >>> a2.barFighters()Traceback(most recent call last):File"<stdin>", line 1,in<module>AttributeError: A instance has no attribute 'barFighters'

    More information can be found by reading about descriptors and metaclass programming.

  • 相关阅读:
    RabbitMQ消息队列 基本订阅/发布Demo(PHP版)
    Docker安装部署RabbitMQ
    CentOS Docker 基本操作
    new worker
    JavaScript避坑
    如何开启MySQL慢查询日志
    kinshard
    Linux shell
    Linux shell
    Linux shell
  • 原文地址:https://www.cnblogs.com/wangjixianyun/p/3420616.html
Copyright © 2020-2023  润新知