الحصول على مساحة الاسم الأصل للكائن في بيثون؟

StackOverflow https://stackoverflow.com/questions/954340

  •  11-09-2019
  •  | 
  •  

سؤال

في بيثون، من الممكن استخدام "." من أجل الوصول إلى العناصر التي قاموس الكائنات. علي سبيل المثال:

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

من فوق المثال، وجود كائن "A"، هل من الممكن الحصول عليها من الإشارة إلى "OBJ" هي مساحة الاسم الأصلية لطريقة "FOO" المعينة؟ على سبيل المثال، لتغيير OBJ.B إلى 2؟

هل كانت مفيدة؟

المحلول

بيثون 2.6+ (بما في ذلك بيثون 3)

يمكنك استعمال ال __self__ خاصية طريقة ملزمة للوصول إلى مثيل أن الطريقة ملزمة.

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

بيثون 2.2+ (بيثون 2.x فقط)

يمكنك أيضا استخدام im_self الممتلكات، ولكن هذا ليس متوافقا مع بيثون 3.

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

نصائح أخرى

في طرق ملزمة، يمكنك استخدام ثلاثة معلمات خاصة للقراءة فقط:

  • IM_FUNC. التي ترجع كائن وظيفة (غير من غير المنطقي)
  • أنا ذاتي الذي يعيد الكائن الوظيفة ملزمة (مثيل الفصل)
  • im_class. الذي يعود فئة أنا ذاتي

اختبار حول:

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

هناك شيء مثير للاهتمام أن نلاحظ هنا، وهذا يمنحك تلميحا حول كيفية استدعاء الأساليب:

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

منذ python2.6 مرادفات ل im_self و im_func نكون __self__ و __func__, ، على التوالى. im* ذهب السمات تماما في PY3K. لذلك سوف تحتاج إلى تغييره إلى:

>> a.__self__
<__main__.test object at 0xb7b7d9ac>
>> a.__self__.b = 2
>> obj.b
2
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top