Как написать django-подобную Классовую ("Модели") инициализацию - PullRequest
0 голосов
/ 08 октября 2019

У меня есть объект под названием «TemporaryPriceReduction», который сообщает мне информацию о продукте, который подвергается продаже. Класс выглядит примерно так:

class TPR:
    def __init__(self, product_id, territory):
        self.product_id = product_id
        self.territory = territory

В моделях django он позволяет определять вещи вне init (по крайней мере, в конкретной модели, которая наследует базовый класс models.Model:

class TPR(models.Model):
    product_id = ...
    territory = ...

По сути, я хотел бы иметь возможность сделать это:

class TPR(AbstractClass):
    product_id = product_id
    territory = territory

Как я могу построить что-то вроде абстрактного базового класса, чтобы я мог определять вещи вне init (как вdjango) вместо того, чтобы писать init?

1 Ответ

1 голос
/ 08 октября 2019

То, что вы описываете, является особенностью простого python, а не конкретно django.

Когда вы присваиваете self.product_id = ... в __init__, вы назначаете атрибут в экземпляре под названием product_id.

Когда вы присваиваете product_id = ... в теле класса, вы создаете в классе атрибут TPR.product_id. Экземпляры вашего класса не будут иметь такого атрибута, если вы не назначите их явно. Поиск атрибутов Python работает так, что instance.product_id найдет отсутствующие атрибуты в классе. Это означает, что все экземпляры, которые явно не переопределяют product_id, например, в __init__, совместно используют тот же объект, что и их product_id через класс.

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

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