Frage

In Python ist es möglich, verwenden '' um Objekt Wörterbuch Artikel zugreifen. Zum Beispiel:

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

Von obigen Beispiel ‚a‘ zum Gegenstand haben, ist es möglich, erhalten von ihm ‚obj‘ verweisen, das ist ein Elternteil Namespace für ‚foo‘ Methode zugeordnet? Zum Beispiel ändern obj.b in 2?

War es hilfreich?

Lösung

Python 2.6+ (einschließlich Python 3)

Sie können die __self__ Eigenschaft eines gebundenen Verfahren die Instanz zugreifen, dass das Verfahren zu gebunden ist.

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

Python 2.2 + (Python 2.x nur)

Sie können auch die im_self Eigenschaft verwenden, aber das ist nicht vorwärts kompatibel mit Python 3.

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

Andere Tipps

Auf gebundene Methoden können Sie drei spezielle Nur-Lese-Parameter verwenden:

  • im_func , die die (nicht gebundenen) Funktion Objekt zurückgibt
  • im_self , die das Objekt gibt die Funktion an (Klasseninstanz) gebunden ist
  • im_class , die die Klasse von liefert im_self

Test um:

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 ...>

Es ist eine interessante Sache hier zu beachten, dass Sie einen Hinweis darauf, wie die Methoden gibt aufgerufen werden:

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')

Im Grunde im_self Attribut einer gebundenen Methode Änderungen erlauben es als ersten Parameter verwenden beim Aufruf von im_func

da python2.6 Synonyme für im_self und im_func sind __self__ und __func__ sind. im* Attribute werden in py3k komplett verschwunden. so müssen Sie es ändern:

>> a.__self__
<__main__.test object at 0xb7b7d9ac>
>> a.__self__.b = 2
>> obj.b
2
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top