Question

En python, il est possible d'utiliser. » afin d'accéder aux éléments du dictionnaire de l'objet. Par exemple:

class test( object ) :
  def __init__( self ) :
    self.b = 1
  def foo( self ) :
    pass
obj = test()
a = obj.foo

De exemple ci-dessus, ayant « un » objet, est-il possible d'obtenir de faire référence à « obj » qui est un espace de noms de parent pour la méthode « foo » attribué? Par exemple, pour changer obj.b en 2?

Était-ce utile?

La solution

Python 2.6+ (y compris python 3)

Vous pouvez utiliser la propriété __self__ d'une borne procédé pour accéder à l'instance que le procédé est lié.

>> a.__self__
<__main__.test object at 0x782d0>
>> a.__self__.b = 2
>> obj.b
2

Python 2.2+ (Python 2.x seulement)

Vous pouvez également utiliser la propriété im_self, mais ce n'est pas compatible avec Python avant 3.

>> a.im_self
<__main__.test object at 0x782d0>

Autres conseils

Sur les méthodes liées, vous pouvez utiliser trois paramètres de lecture seule spécial:

  • im_func qui renvoie l'objet de fonction (non lié)
  • im_self qui renvoie l'objet de la fonction est liée à (instance de la classe)
  • im_class qui retourne la classe de im_self

Test autour de:

class Test(object):
    def foo(self):
        pass

instance = Test()
instance.foo          # <bound method Test.foo of <__main__.Test object at 0x1>>
instance.foo.im_func  # <function foo at 0x2>
instance.foo.im_self  # <__main__.Test object at 0x1>
instance.foo.im_class # <__main__.Test class at 0x3>

# A few remarks
instance.foo.im_self.__class__ == instance.foo.im_class # True
instance.foo.__name__ == instance.foo.im_func.__name__  # True
instance.foo.__doc__ == instance.foo.im_func.__doc__    # True

# Now, note this:
Test.foo.im_func != Test.foo # unbound method vs function
Test.foo.im_self is None

# Let's play with classmethods
class Extend(Test):
    @classmethod
    def bar(cls): 
        pass

extended = Extend()

# Be careful! Because it's a class method, the class is returned, not the instance
extended.bar.im_self # <__main__.Extend class at ...>

Il y a une chose intéressante à noter ici, qui vous donne une indication sur la façon dont les méthodes sont appelées:

class Hint(object):
    def foo(self, *args, **kwargs):
        pass

    @classmethod
    def bar(cls, *args, **kwargs):
        pass

instance = Hint()

# this will work with both class methods and instance methods:
for name in ['foo', 'bar']:
    method = instance.__getattribute__(name)
    # call the method
    method.im_func(method.im_self, 1, 2, 3, fruit='banana')

En fait, im_self attribut d'un changement de méthode liée, pour permettre l'utiliser comme premier paramètre lorsque vous appelez im_func

puisque synonymes de python2.6 pour im_self et im_func sont __self__ et __func__, respectivement. attributs im* sont complètement disparu dans Py3K. de sorte que vous devrez changer à:

>> a.__self__
<__main__.test object at 0xb7b7d9ac>
>> a.__self__.b = 2
>> obj.b
2
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top