How can a function access its own attributes?

前端 未结 16 1835
再見小時候
再見小時候 2020-11-28 07:49

is it possible to access the python function object attributes from within the function scope?

e.g. let\'s have

def f():
    return          


        
16条回答
  •  暗喜
    暗喜 (楼主)
    2020-11-28 07:55

    If there is only one method needed but you want a light-weight class with shared class state plus individual instance state, you might try the closure pattern like this:

    # closure example of light weight object having class state,
    #    local state, and single method
    # This is a singleton in the sense that there is a single class
    #    state (see Borg singleton pattern notebook)
    #    BUT combined with local state
    # As long as only one method is needed, this one way to do it
    # If a full class singleton object is needed with multiple 
    #    methods, best look at one of the singleton patterns
    
    def LW_Object_Factory(localState):
    
        # class state - doesn't change
        lwof_args = (1, 2, 3)
        lwof_kwargs =  {'a': 4, 'b': 5}
    
        # local instance - function object - unique per
        # instantiation sharing class state
        def theObj(doc, x):
            print doc, 'instance:'
            print '\tinstance class state:\n\t\targs -', \
                  lwof_args, ' kwargs -', lwof_kwargs
            print '\tinstance locals().items():'
            for i in locals().items():
                print '\t\t', i
            print '\tinstance argument x:\n\t\t', '"{}"'.format(x)
            print '\tinstance local state theObj.foo:\n\t\t',\
                  '"{}"'.format(theObj.foo)
            print ''
    
        # setting local state from argument
        theObj.foo = localState
    
        return(theObj)
    
    lwo1 = LW_Object_Factory('foo in local state for first')
    lwo2 = LW_Object_Factory('foo in local state for second')
    
    # prove each instance is unique while sharing class state
    print 'lwo1 {} distinct instance from lwo2\n'\
          .format(id(lwo1) <> id(lwo2) and "IS" or "IS NOT")
    
    # run them
    lwo1('lwo1', 'argument lwo1') 
    lwo2('lwo2', 'argument lwo2')
    

提交回复
热议问题