Получение токена абстрактного класса Python

Решил проверить, что делает метод abc.get_cache_token(), однако не понимаю, почему при выводе токена, все время печатает одно и тоже значение. Исходя из определения, я бы хотел знать, что это версия кэша и зачем сравнивать?

Токен представляет собой непрозрачный объект (поддерживающий проверку на равенство), идентифицирующий текущую версию кэша абстрактного базового класса для виртуальных подклассов.

import abc
import unittest
from abc import ABC, abstractmethod, ABCMeta

class Test_Environment(unittest.TestCase):
    def test(self):
        class A(metaclass=abc.ABCMeta):
            @abstractmethod
            def func(self):
                raise NotImplementedError

        class B(A):
            def func(self):
                print("inheritance")


        Otoken = abc.get_cache_token()
        obj = B()
        Ntoken = abc.get_cache_token()
        self.assertEqual(Otoken, Ntoken, 'equal')
        print(Otoken, Ntoken)

mc = Test_Environment()
mc.test()

27 27 вывод

При этом, комментарий equal, в методе assertEqual, не вывелся и никак не среагировал.


Ответы (1 шт):

Автор решения: Pak Uula

Токен обновляется только тогда, когда вы связываете класс-предок с ненаследным классом через вызов статического метода register. Так как в вашем примере класс B явным образом наследует классу A, метод A.register не вызывается.

Если вы хотите увеличить значение токена, переделайте пример

class Test_Environment(unittest.TestCase):
    def test(self):
        class A(metaclass=abc.ABCMeta):
            @abstractmethod
            def func(self):
                raise NotImplementedError
        class B:
            def func(self):
                print("inheritance")

        Otoken = abc.get_cache_token()
        A.register(B)
        Ntoken = abc.get_cache_token()
        obj = B()
        self.assertTrue(issubclass(B, A))
        self.assertTrue(isinstance(obj, A))
        self.assertEqual(Otoken, Ntoken, 'equal')
        print(Otoken, Ntoken)

При такой последовательности операций assertEqual отвалится:

AssertionError: 26 != 27 : equal
→ Ссылка