forked from Rust-related/RustPython
64 lines
1.2 KiB
Python
64 lines
1.2 KiB
Python
|
|
class A:
|
|
pass
|
|
|
|
|
|
class B(A):
|
|
pass
|
|
|
|
|
|
assert issubclass(A, A)
|
|
assert issubclass(B, A)
|
|
assert not issubclass(A, B)
|
|
|
|
|
|
class MCNotSubClass(type):
|
|
def __subclasscheck__(self, subclass):
|
|
return False
|
|
|
|
|
|
class NotSubClass(metaclass=MCNotSubClass):
|
|
pass
|
|
|
|
|
|
class InheritedNotSubClass(NotSubClass):
|
|
pass
|
|
|
|
|
|
assert not issubclass(A, NotSubClass)
|
|
assert not issubclass(NotSubClass, NotSubClass)
|
|
assert not issubclass(InheritedNotSubClass, NotSubClass)
|
|
assert not issubclass(NotSubClass, InheritedNotSubClass)
|
|
|
|
|
|
class MCAlwaysSubClass(type):
|
|
def __subclasscheck__(self, subclass):
|
|
return True
|
|
|
|
|
|
class AlwaysSubClass(metaclass=MCAlwaysSubClass):
|
|
pass
|
|
|
|
|
|
class InheritedAlwaysSubClass(AlwaysSubClass):
|
|
pass
|
|
|
|
|
|
assert issubclass(A, AlwaysSubClass)
|
|
assert issubclass(AlwaysSubClass, AlwaysSubClass)
|
|
assert issubclass(InheritedAlwaysSubClass, AlwaysSubClass)
|
|
assert issubclass(AlwaysSubClass, InheritedAlwaysSubClass)
|
|
|
|
|
|
class MCAVirtualSubClass(type):
|
|
def __subclasscheck__(self, subclass):
|
|
return subclass is A
|
|
|
|
|
|
class AVirtualSubClass(metaclass=MCAVirtualSubClass):
|
|
pass
|
|
|
|
|
|
assert issubclass(A, AVirtualSubClass)
|
|
assert not isinstance(B, AVirtualSubClass)
|