假设我有一个具有t
属性的Python类型。我想创建一个“参数化的元类型”,以便以下工作:
class MySuperClass(type):
pass
class MySubClass(MySuperClass):
# Here is the problem -- How do I define types that contain stuff,
# independent of an object?
def __init__(self, t): # Or __getitem__
self.t = t
def __instancecheck__(self, instance):
return isinstance(instance, MySubClass) and instance.t == self.t
def __subclasscheck__(self, subclass):
return MySubClass in subclass.__mro__ and subclass.t == self.t
class MyObject(metaclass=MySubClass):
def __init__(self, t):
self.t = t
# Test code:
## Both of these, square brackets work too
assert isinstance(MyObject(0), MySubClass(0))
assert not isinstance(MyObject(0), MySubClass(1))
## Ideally
assert isinstance(MyObject(0), MySuperClass) or isinstance(MyObject(0), MySubClass)
当前出现以下错误:
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-4-99ad08881526> in <module>
14 return MySubClass in subclass.__mro__ and subclass.t == self.t
15
---> 16 class MyObject(metaclass=MySubClass):
17 def __init__(self, t):
18 self.t = t
TypeError: __init__() takes 2 positional arguments but 4 were given
可以满足第一部分或要求。但它需要一个辅助的检查器类。MySubClass是类型的后代,
MySubClass(0)
应该是类。它足以在MySubClass
中创建一个内部类InstanceChecker
类,并将__instancecheck__
覆盖它们的类。你知道吗代码可以是:
顺便说一句,我已经删除了
__subclasscheck__
覆盖,因为t
中只有MyObject
中的实例属性或者,元类可以在
bases
参数中自动添加一个超类。在下面的代码中,MySuperClass
不再是MySubClass
的超类,而是MyObject
:我似乎找到了一个解决办法,而且比我最初想的要干净得多。你知道吗
相关问题 更多 >
编程相关推荐