<p>可以满足第一部分或要求。但它需要一个辅助的<em>检查器</em>类。MySubClass是类型的后代,<code>MySubClass(0)</code>应该是类。它足以在<code>MySubClass</code>中创建一个内部类<code>InstanceChecker</code>类,并将<code>__instancecheck__</code>覆盖它们的类。你知道吗</p>
<p>代码可以是:</p>
<pre><code>class MySubClass(MySuperClass):
def __new__(cls, name, bases=None, namespace=None, *args, **kwargs):
if bases is not None:
return super().__new__(cls, name, bases, namespace, **kwargs)
return cls.InstanceChecker(name)
class InstanceChecker:
def __init__(self, t):
self.t = t
def __instancecheck__(self, instance):
return isinstance(instance.__class__, MySubClass) and instance.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))
</code></pre>
<p>顺便说一句,我已经删除了<code>__subclasscheck__</code>覆盖,因为<code>t</code>中只有<code>MyObject</code>中的<em>实例</em>属性</p>
<hr/>
<p>或者,元类可以在<code>bases</code>参数中自动添加一个超类。在下面的代码中,<code>MySuperClass</code>不再是<code>MySubClass</code>的超类,而是<code>MyObject</code>:</p>
<pre><code>class MySuperClass():
pass
class MySubClass(type):
def __new__(cls, name, bases=None, namespace=None, *args, **kwargs):
if bases is not None:
return super().__new__(cls, name, bases + (MySuperClass,), namespace, **kwargs)
return cls.InstanceChecker(name)
class InstanceChecker:
def __init__(self, t):
self.t = t
def __instancecheck__(self, instance):
return isinstance(instance.__class__, MySubClass) and instance.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)
</code></pre>