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

2024-05-14 22:47:14 发布

您现在位置:Python中文网/ 问答频道 /正文

这更多的是一个理论问题,与实际问题无关

考虑到你有一些职业:

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'>

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


Tags: namefromnewmaintypepass理论attrs
1条回答
网友
1楼 · 发布于 2024-05-14 22:47:14

您应该将__new__放在A类中以实现所需的行为。例如:

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__在类A创建时被调用,但在创建它的实例时不会像您所期望的那样被调用

相关问题 更多 >

    热门问题