zoukankan      html  css  js  c++  java
  • 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.

  • 相关阅读:
    P4294 [WC2008]游览计划(斯坦纳树)
    CF1056E Check Transcription(SA)
    CF1391D 505(状压dp+思维)
    CF56E Domino Principle(BIT+dp)
    P3402 可持久化并查集
    可持久化平衡树
    前端网页的懒加载
    多种认证、授权模型的比较
    CSS变量(自定义属性)实践指南
    SCSS提取和懒加载
  • 原文地址:https://www.cnblogs.com/wangjixianyun/p/3420616.html
Copyright © 2011-2022 走看看