Как получить экземпляр модели, вызывая миксин?

Я помещаю метод form_valid() в миксин следующим образом...

''' class PaymentAtomicMixin(object):

@transaction.atomic
def form_valid(self, form):
    try:
        with transaction.atomic():
            self.instance = form.save(commit=False)
            ....
    ....
    form.instance.user = self.request.user
return super().form_valid(form)

'''

3 модели подклассифицируют/используют этот миксин, и мне придется выполнять различные действия в зависимости от того, какая модель выполняет метод form_save(). Как я узнаю, какая модель и экземпляр модели использует этот миксин? (Django 3.2.7, Python 3.9.5)

Как вам уже намекнул @BrianD: это очень плохой антипаттерн, и вам, вероятно, не стоит этого делать. Если вам интересно, как это сделать в теории из любопытства, вот пример. Ключ в том, чтобы использовать isinstance().

class MyMixin:
    prefix: str

    def show_prefix(self):
        if isinstance(self, A):
            print(f'Prefix of {self.__class__.__name__} is {self.prefix}')
        elif isinstance(self, B):
            print(f'Prefix of {self.__class__.__name__} is {self.prefix}')
        elif isinstance(self, C):
            print(f'Prefix of {self.__class__.__name__} is {self.prefix}')
        else:
            raise AssertionError(f'Class {self.__class__.__name__} is not allowed to use MyMixin')


class A(MyMixin):
    prefix = 'AAA'


class B(MyMixin):
    prefix = 'BBB'


class C(MyMixin):
    prefix = 'CCC'


A().show_prefix()
B().show_prefix()
C().show_prefix()

EDIT

Прочитав ваш ответ и лучше поняв, чего вы хотите добиться, я бы рассмотрел следующий код.

from enum import Enum


class MyMixinPrefix(Enum):
    a = 'AAA'
    b = 'BBB'
    
    
class MyMixin:
    prefix: MyMixinPrefix

    def show_prefix(self):
        if self.prefix == MyMixinPrefix.a:
            print(f'Do A logic')
        elif self.prefix == MyMixinPrefix.b:
            print(f'Do B logic')
        else:
            raise AssertionError(f'Unknown prefix')


class A(MyMixin):
    prefix = MyMixinPrefix.a


class B(MyMixin):
    prefix = MyMixinPrefix.b


class C(MyMixin):
    prefix = MyMixinPrefix.a


A().show_prefix()
B().show_prefix()
C().show_prefix()
Вернуться на верх