Получение токена абстрактного класса 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 шт):
Токен обновляется только тогда, когда вы связываете класс-предок с ненаследным классом через вызов статического метода 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