Получение родительского пространства имен объекта в Python?

Предполагая, что вы хотите написать код, подобный следующему:

for x in $(seq 1 100); do     # 100 things we want to put into the background.
    max_bg_procs 5            # Define the limit. See below.
    your_intensive_job &
done

Где max_bg_procs следует поместить в ваш .bashrc:

function max_bg_procs {
    if [[ $# -eq 0 ]] ; then
            echo "Usage: max_bg_procs NUM_PROCS.  Will wait until the number of background (&)"
            echo "           bash processes (as determined by 'jobs -pr') falls below NUM_PROCS"
            return
    fi
    local max_number=$((0 + ${1:-0}))
    while true; do
            local current_number=$(jobs -pr | wc -l)
            if [[ $current_number -lt $max_number ]]; then
                    break
            fi
            sleep 1
    done
}
9
задан Nicolas Dumazet 5 June 2009 в 07:11
поделиться

3 ответа

Python 2.6+ (включая Python 3)

Вы можете использовать свойство __ self __ связанного метода для доступа к экземпляру, к которому привязан метод.

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

Python 2.2+ (Только для Python 2.x)

Вы также можете использовать свойство im_self , но оно несовместимо с Python 3.

>> a.im_self
<__main__.test object at 0x782d0>
14
ответ дан 4 December 2019 в 06:27
поделиться

В связанных методах вы можете использовать три специальных параметра только для чтения:

  • im_func , который возвращает (несвязанный) объект функции
  • im_self , который возвращает объект функция привязана к (экземпляру класса)
  • im_class , который возвращает класс im_self

Тестирование:

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_self связанного метода изменяется, чтобы можно было использовать его в качестве первого параметра при вызове im_func

17
ответ дан 4 December 2019 в 06:27
поделиться

, поскольку в python2.6 синонимами для im_self и im_func являются __ self __ и __ func __ , соответственно. Атрибуты im * полностью удалены в py3k. поэтому вам нужно будет изменить его на:

>> a.__self__
<__main__.test object at 0xb7b7d9ac>
>> a.__self__.b = 2
>> obj.b
2
7
ответ дан 4 December 2019 в 06:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: