Erste Aufgabe der Eltern-Namespace in Python?
-
11-09-2019 - |
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?
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