Какой код выполняется при определении класса? - PullRequest
4 голосов
/ 30 октября 2011

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


Редактировать: Я понимаю, что мой вопрос может быть слишком общим ...

Я ищудля чего-то более низкого уровня, который позволит мне делать самоанализ из C ++.Я расширяю свое приложение C ++ с помощью Python.У меня есть некоторые классы, которые определены в C ++ и выставлены в Python.Пользователь может наследовать эти классы в сценариях, и я хочу иметь возможность получать подробные сведения о них при их первом определении.

Ответы [ 5 ]

5 голосов
/ 30 октября 2011

Может случиться много разных вещей. Самое основное:

Содержимое блока class выполняется при первом чтении.

Чтобы увидеть это в действии, этот пример:

class Foo(object):
    print "bar"

    def __init__(self):
        print "baz"

Будет печатать bar при импорте модуля.

Если для класса определен метакласс, функция метаклассов __new__ будет запущена после запуска блока классов.

Пример:

class MyMeta(type):
    def __new__(mcs, name, bases, kwargs):
        print "I'm the metaclass, just checking in."
        return type.__new__(mcs, name, bases, kwargs)


class Foo(object):
    __metaclass__ = MyMeta

    print "I'm the Foo class"

Выход:

I'm the Foo class
I'm the metaclass, just checking in.

Я уверен, что другие биты тоже могут работать, это как раз то, с чем я знаком.

4 голосов
/ 30 октября 2011

Определение класса A, который наследуется от B и C, выполняется: A = type('A', (B, C), m, где m - это словарь, содержащий членов класса.

Вы можете влиять на процесс с помощью программирования метакласса. Нет недостатка в публикациях в блогах и учебных пособий по теме .

3 голосов
/ 30 октября 2011

Вас могут заинтересовать метаклассы , которые являются классами, которые контролируют создание классов.

2 голосов
/ 30 октября 2011

Код в определении класса выполняется точно так же, как любой другой код, но любые созданные переменные (включая определения функций) будут в контексте класса, а не глобальными.Это означает, что вы можете динамически изменить определение класса, добавив условный код:

class A(object):
    if 1==2:
        def f(self):
            print "the world has gone mad"
    else:
        def f(self):
            print "sanity rules"

>>> a = A()
>>> a.f()
sanity rules
>>> 

Однако я никогда не видел, чтобы это было сделано, и не могу придумать причину для этого - это кажется довольно неуместным.

Как уже отмечали другие, существует множество других способов изменения поведения класса, включая метаклассы, наследование и декораторы классов.

0 голосов
/ 30 октября 2011

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

...