制作两个具有相同名称的类对象是否安全?

时间:2014-09-30 05:23:46

标签: python metaclass

可以在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返回复制的类)。

1 个答案:

答案 0 :(得分:2)

如果你想并且有充分的理由,你没有理由不能在同一个模块中拥有2个具有相同__name__的课程。

e.g。在您的示例中from module import Fruit - python根本不关心类的__name__。它在Fruit模块的全局变量中查找并导入它在那里找到的内容。


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

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

B = copy_class(A)

在这种情况下,当调用B.foo时,它最终会调用super(A, self),这可能会导致在许多情况下出现时髦行为。 。