可以在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
返回复制的类)。你知道吗
如果您愿意并且有充分的理由这样做,那么就没有理由不能在同一个模块中有两个具有相同
__name__
的类。你知道吗例如,在您的示例中
from module import Fruit
python根本不关心类的__name__
。它在模块的globals中查找Fruit
,并导入在那里找到的内容。你知道吗请注意,一般来说,如果您使用
super
,这种方法不是很好(尽管对于类装饰器也是如此……):在这种情况下,当调用
B.foo
时,它将最终调用super(A, self)
,这可能会在许多情况下导致怪异的行为。你知道吗相关问题 更多 >
编程相关推荐