是否可以创建一个 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 时不被调用预期。
更多的是理论问题,与实际问题无关。
考虑到你有一些 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 时不被调用预期。