可以在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
返回复制的类)。
答案 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)
,这可能会导致在许多情况下出现时髦行为。 。