创建两个同名的类对象安全吗?

2024-04-26 06:40:34 发布

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

可以在Python中使用type来创建一个新的类对象,您可能知道:

A = type('A', (object,), {})

a = A() # create an instance of A

我想知道的是,用相同的名称创建不同的类对象是否有问题,例如,从上面继续:

B = type('A', (object,), {})

换句话说,第二个类对象B与第一个类对象A同名,是否存在问题?你知道吗


这样做的动机是,我希望获得一个类的干净副本,以便在不使用in this question描述的继承方法的情况下应用不同的装饰器。你知道吗

所以我想正常地定义一个类,例如:

class Fruit(object):
    pass

然后制作一个新的副本:

def copy_class(cls):
    return type(cls.__name__, cls.__bases__, dict(cls.__dict__))

FreshFruit = copy_class(fruit)

在我的测试中,我对FreshFruit所做的事情与我对Fruit所做的事情是适当地分离的。你知道吗

但是,我不确定是否也应该在copy_class中损坏名称以避免意外问题。你知道吗

我特别担心的是,这可能会导致在模块的字典中替换类,这样将来的导入(例如,from module import Fruit返回复制的类)。你知道吗


Tags: 对象instance名称anobjecttypecreate副本
1条回答
网友
1楼 · 发布于 2024-04-26 06:40:34

如果您愿意并且有充分的理由这样做,那么就没有理由不能在同一个模块中有两个具有相同__name__的类。你知道吗

例如,在您的示例中from module import Fruitpython根本不关心类的__name__。它在模块的globals中查找Fruit,并导入在那里找到的内容。你知道吗


请注意,一般来说,如果您使用super,这种方法不是很好(尽管对于类装饰器也是如此……):

class A(Base):
    def foo(self):
        super(A, self).foo()

B = copy_class(A)

在这种情况下,当调用B.foo时,它将最终调用super(A, self),这可能会在许多情况下导致怪异的行为。你知道吗

相关问题 更多 >