Как получить доступ к родительскому классу во время инициализации в python? - PullRequest
2 голосов
/ 05 июня 2009

Как узнать, в каком классе я инициализирую декоратор? Имеет смысл, что я не смог бы это выяснить, поскольку декоратор еще не привязан к классу, но есть ли способ обойти это?

class A(object):
    def dec(f):
                # I am in class 'A'
        def func(cls):
            f(cls)
        return func

    @dec
    def test(self):
        pass

Мне нужно знать, к какому классу я принадлежу (обозначено закомментированной строкой).

Ответы [ 3 ]

3 голосов
/ 05 июня 2009

Я не думаю, что это возможно. В тот самый момент, когда вы определяете test, класс еще не существует.

Когда Python встречает

class A(object):

он создает новое пространство имен, в котором он запускает весь код, который он находит в определении класса (включая определение test () и вызов декоратора), а когда это сделано, он создает новый объект класса и помещает все в этом классе, которое осталось в пространстве имен после выполнения кода.

Итак, когда вызывается декоратор, он еще ничего не знает. На данный момент тест - это просто функция.

0 голосов
/ 06 июня 2009

Как указала Надя, вам нужно быть более конкретным. Python не допускает подобных вещей, а это значит, что то, что вы пытаетесь сделать, вероятно, является чем-то неправильным

А пока вот мой вклад: небольшая история о матросе и лягушке. (используйте конструктор после инициализации класса)

class Cruise(object):
    def arewelostyet(self):
        print 'Young sailor: I think I am lost, help me :s'

instance = Cruise()

instance.arewelostyet()

def whereami(lostfunc):
    """
    decorator
    """
    def decorated(*args, **kwargs):
        lostfunc(*args, **kwargs)
        print 'Frog: Crôak! thou art sailing in class', lostfunc.im_class.__name__

    # don't forget to write name and doc
    decorated.func_name = lostfunc.func_name
    decorated.func_doc = lostfunc.func_name

    return decorated


print '[i]A frog pops out of nowhere[/i]'

# decorate the method:
Cruise.arewelostyet = whereami(Cruise.arewelostyet)

instance.arewelostyet()
0 голосов
/ 05 июня 2009

Я не понимаю вопрос.

>>> class A(object):
    def dec(f):
        def func(cls):
            print cls
        return func

    @dec
    def test(self):
        pass

>>> a=A()
>>> a.test()
<__main__.A object at 0x00C56330>
>>> 

Аргумент (cls) - это класс, A.

...