Python: подводные камни создания суперобъекта - PullRequest
2 голосов
/ 23 июня 2011

Мы обнаружили, что у нас есть набор атрибутов (которые не будут меняться и извлекаться из среды во время выполнения), которые существуют в большинстве наших классов.Я попытался найти это, но, к сожалению, «объект» - очень распространенное слово.

Какие проблемы возникнут у меня, если я сделаю следующее:

class MasterObjectv2(object):
     UNIQUE_KEY = getUniqueKey()
     #other properties for all objects in our system

или это лучше:

class MasterObject(object):
    def __init__(self):
        object.__init__(self)
        #other properties for all objects in our system
        self.getUniqueKey()

или опция 3

# is that its a really dumb idea to do this.

Я думал о том, чтобы сделать первое, потому что мне не нужно беспокоиться о том, чтобы кто-то не звонил init в MasterObject.

Очевидно, наш класс изменится с

class Test(object):
   def __init__(self): 
        self.UNIQUE_KEY = getUniqueKey()

на

class Test(MasterObject):
    def __init__(self): pass

Редактировать

Эти ответы неответь на мой вопрос.Я не спрашиваю, что мне следует делать, я спрашиваю о том, о каких побочных эффектах / вещах следует подумать, если мы собираемся пойти по этому пути.

Я рассматриваю возможность использования среды. * Тип класса, ноСначала я хочу узнать, какими могут быть побочные эффекты * , если , я пойду другим путем.

Я не хочу, чтобы это превратилось в дебаты о композиции и наследовании ...;)

Ответы [ 4 ]

1 голос
/ 28 июня 2011

С помощью python вы можете легко управлять объектом конструкция в дополнение к объекту инициализация ; например, определение

class Master(object):
    def __new__(klass, *args, **kwargs):
        self = object.__new__(klass)
        self.attribute1 = ...
        self.attribute2 = ...
        return self

Код в __new__ выполняется до запуска __init__, определенного в конечном итоге в производном классе (поэтому не имеет значения, если производный класс не вызывает Master.__init__(self)). Вы можете использовать __new__ для установки некоторых атрибутов в экземпляре до начала __init__.

Является ли это разумным поступком в вашем случае, во многом зависит от деталей, которые вы не предоставили.

1 голос
/ 23 июня 2011

Вам действительно нужны эти атрибуты в ваших реальных классах?Похоже, держать их в каком-то «объекте конфигурации» и просто получать к ним доступ из классов - более надежная идея.

Предпочитаю строго хранить наследование в тех случаях, когда подразумевается отношение is-a , что в вашем случае не соответствует действительности, AFAIU.

0 голосов
/ 23 июня 2011

Будут ли значения атрибутов, взятых из среды, одинаковыми для всех этих классов? Если это так, вам, вероятно, будет лучше просто сохранить dict этих атрибутов среды на уровне модуля. (Или, как предложил кто-то другой, используйте модуль для заполнения и сохранения переменных среды.)

Если нет, то я бы предложил использовать метод создания класса, который вы использовали бы для заполнения словаря переменных среды в ваших классах при первом вызове __init__ для каждой из них.

0 голосов
/ 23 июня 2011

Используйте параметр # 1, если атрибуты являются статическими. Поскольку атрибут является свойством класса и не изменяется от экземпляра к экземпляру, это, кажется, правильный выбор. Вы не вызовете никаких проблем, выбрав опцию № 1 (при условии, что ваши классы реализованы аналогично Test).

class MasterObjectv2(object):
     UNIQUE_KEY = getUniqueKey()
     #other properties for all objects in our system

Тогда ваш тестовый класс может быть реализован следующим образом:

class Test(MasterObject):
    pass
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...