是否可以创建一个 class,每个实例都有不同的类型?

Is it possible to create a class, each instance of which will have different type?

更多的是理论问题,与实际问题无关。

考虑到你有一些 class:

class A():
    pass

a = A()
type(a)
# <class '__main__.A'>

是否可以实现这样的东西?

from random import randint

class Randomized(type):
    def __new__(cls, name, bases, attrs):
        attrs['__qualname__'] += str(randint(0, 99))
        return super(Randomized, cls).__new__(cls, name, bases, attrs)

class A(metaclass=Randomized):
    pass

a = A()
b = A()
# as I was thinking:
type(a)
# <class '__main__.A75'>
type(b)
# <class '__main__.A23'>

上面的例子没有像我预期的那样工作,因为 Randomized.__new__ 似乎只调用了一次:

a = A()
b = A()
type(a)
# <class '__main__.A66'>
type(b)
# <class '__main__.A66'>

关于 metaclasses 的相关 PEP: https://www.python.org/dev/peps/pep-3115/

您应该将 __new__ 放在 A class 中以获得所需的行为。示例:

from random import randint


class A:
    def __new__(cls, *args, **kwargs):
        random_cls = type('random_name' + str(randint(0, 99)), (object,), {})
        return random_cls()


a = A()
b = A()
print(type(a))
# <class '__main__.random_name90'>
print(type(b))
# <class '__main__.random_name22'>

__new__ in metaclass 在 class A 创建时被调用,但在创建 instances 时不被调用预期。