Python: создание экземпляра класса, не называя инициализатор

OP не использует абстрактный базовый класс ... но если вы, то обнаружите, что жесткое кодирование связанного_имя в FK (например ..., related_name = "myname") приведет к ряду эти ошибки конфликтов - по одному для каждого унаследованного класса из базового класса. В приведенной ниже ссылке содержится обходной путь, который прост, но определенно не очевиден.

Из django docs ...

Если вы используете атрибут related_name на сервере ForeignKey или ManyToManyField, вы всегда должны указывать уникальное обратное имя для этого поля. Это обычно вызывает проблему в абстрактных базовых классах, поскольку поля этого класса включаются в каждый из дочерних классов с одинаковыми значениями для атрибутов (включая related_name) каждый раз.

blockquote>

Подробнее здесь .

27
задан Noctis Skytower 30 January 2010 в 19:13
поделиться

3 ответа

Используйте @staticmethod в вершине Вашей функции.

, Например:

class TestClass:
    def __init__(self, a):
        print(1)
        self.arg = a
    @staticmethod
    def test(name):
        print(name)
TestClass.test('God')
-1
ответ дан 28 November 2019 в 03:30
поделиться

При выполнении, отпускании __ init __ вызвать (и сделать звонок безобидным по подходящим аргументам) предпочтительнее. Тем не менее, следует ли, чтобы потребовать слишком много анкету, у вас есть альтернатива, до тех пор, пока вы избегаете катастрофического выбора с использованием классов старого стиля (есть NO Неужели причина использовать классы старого стиля в Новый код и несколько веских причин не ) ...:

   class String(object):
      ...

   bare_s = String.__new__(String)

Эта идиома обычно используется в ClassMethod , которые предназначены для работы как «альтернативные конструкторы», так что вы Обычно видим, как это используется таким образом, как ...:

@classmethod 
def makeit(cls):
    self = cls.__new__(cls)
    # etc etc, then
    return self

(таким образом, класс Method будет правильно унаследован и генерировать экземпляры подкласса при вызове на подклассе, а не на базовом классе).

34
ответ дан 28 November 2019 в 03:30
поделиться

- передайте в конструктор еще один аргумент, например:

def __init__(self, string, simple = None):
    if simple is None:
        self.__string = tuple(string.split())
        self.__simple = tuple(self.__simple())
    else:
        self.__string = string
        self.__simple = simple

Можно вызвать его так:

def __getitem__(self, key):
    assert isinstance(key, slice)
    return String(self.__string[key], self.__simple[key])

Также я не уверен, что разрешено называть как поле, так и метод __simple. Если только для удобочитаемости, то это следует изменить.

0
ответ дан 28 November 2019 в 03:30
поделиться
Другие вопросы по тегам:

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