Парадокс брадобрея на Python with OOP
Это известный парадокс, вариант парадокса Рассела.
Есть код на Python, который реализует парадокс Рассела, приводя к бесконечной рекурсии.
Там используются именно множества. А я бы хотел в учебно-познавательных целях сделать вариант с брадобреем, используя OOP. Что-то вроде этого:
class Singleton(type):
_instances = {}
def __call__(cls, *args, **kwargs):
if cls not in cls._instances:
cls._instances[cls] = super(Singleton, cls).__call__(*args, **kwargs)
return cls._instances[cls]
class People:
instances = set()
def __init__(self, name, is_self_shaver):
self.name = name
if is_self_shaver:
self.shaver = self
else:
self.shaver = None
People.instances.add(self)
@classmethod
def get_instances(cls):
return cls.instances
class Barber(People, metaclass=Singleton):
pass
Начало, думаю, правильное: класс-синглетон Barber наследуется от People.
Через методы и свойства определяем, бреется ли человек сам.
Но мне никак не удается получить парадокс именно как бесконечную рекурсию!
Как бы я не менял/добавлял методы, получается либо отсутствие объекта, либо просто "все хорошо".
Пробовал и отдельную функцию, пробегающую по всем People.
Если кто-то заинтересуется, буду рад любым идеям!