OP не использует абстрактный базовый класс ... но если вы, то обнаружите, что жесткое кодирование связанного_имя в FK (например ..., related_name = "myname") приведет к ряду эти ошибки конфликтов - по одному для каждого унаследованного класса из базового класса. В приведенной ниже ссылке содержится обходной путь, который прост, но определенно не очевиден.
Из django docs ...
Если вы используете атрибут related_name на сервере ForeignKey или ManyToManyField, вы всегда должны указывать уникальное обратное имя для этого поля. Это обычно вызывает проблему в абстрактных базовых классах, поскольку поля этого класса включаются в каждый из дочерних классов с одинаковыми значениями для атрибутов (включая related_name) каждый раз.
blockquote>Подробнее здесь .
Используйте @staticmethod
в вершине Вашей функции.
, Например:
class TestClass:
def __init__(self, a):
print(1)
self.arg = a
@staticmethod
def test(name):
print(name)
TestClass.test('God')
При выполнении, отпускании __ 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 будет правильно унаследован и генерировать экземпляры подкласса при вызове на подклассе, а не на базовом классе).
- передайте в конструктор еще один аргумент, например:
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
. Если только для удобочитаемости, то это следует изменить.