我正在使用python 3.6。
它采用了“Single”,它将按 id 以单数形式存储实例,但遇到了困难。实例没有通过类型检查,尽管它们看起来应该是这样。
也就是说,该方法__call__返回原始类的一个实例。这也可以通过检查功能来确认type。
但显然,我什么都不知道,因为我不想上课和isinstance争论。CarTree
使用装饰器编写单例以使其通过类型检查的正确方法是什么?
class Singleton:
def __init__(self, cls):
self.__cls = cls
self.__instances = []
print("был вызван конструктор")
def __call__(self, idt, *args, **kwargs):
for instance in self.__instances:
if instance.idt == idt:
return instance
else:
inst = self.__cls(idt=idt, *args, **kwargs)
self.__instances.append(inst)
return inst
@Singleton
class Car:
def __init__(self, *, idt: int):
self.idt = idt
def __str__(self):
return f"Car {self.idt}."
@Singleton
class Tree:
def __init__(self, *, idt: int):
self.idt = idt
def __str__(self):
return f"Tree {self.idt}."
class Paper:
def __init__(self, *, idt: int):
self.idt = idt
def __str__(self):
return f"Tree {self.idt}."
car = Car(idt=1)
tree = Tree(idt=1)
print(car, tree)
car2 = Car(idt=2)
car3 = Car(idt=1)
tree2 = Tree(idt=2)
tree3 = Tree(idt=3)
car4 = Car(idt=1)
paper = Paper(idt=1)
print(car, car2, car3)
print("Проверка типов: ", type(car), type(tree))
print(type(paper), isinstance(paper, Paper))
print("Проверка на синглтон: ", isinstance(car, Singleton))
print(isinstance(tree, Tree))
print(isinstance(car, Car))
你的装饰器返回一个 Singleton 类型的对象,因为
@Singleton语法等价于:因此
isinstance(car, Car)返回False。car它是原始类型的对象 Car(装饰前)与装饰后的对象无关Car。