【发布时间】:2014-04-21 08:46:04
【问题描述】:
我正在尝试设计一个类结构,其中类的基础在运行时确定。非常感谢the answer to this question about metaclasses,它点击type 函数可以通过在运行时构造基元组来完成此操作。太棒了。
现在这开启了我不确定自己是否满意的可能性——通过一些操作序列,我可以得到相当于:
X = type('X', (object,), {})
Y = type('Y', (X,), {})
Y2 = type('Y', (object,), {})
我现在有两个类(Y 和 Y2)具有不同的继承结构,但都共享类名 'Y'。
c = y.__class__
c2 = y2.__class__
(c,c2) #returns (__main__.Y, __main__.Y)
(c.__bases__,c2.__bases__) #returns ((__main__.X,), (object,))
由此看来,类名只是供人类消费的任意字符串,而Python认为,如果我想去迷惑自己,我不客气。
正确吗?如果允许不同的类使用相同的名称,在 Python 的其他地方是否还有陷阱在等着我?
【问题讨论】:
-
我现在不明白你为什么要这么做,但它几乎可以肯定是#hugemistake。如果其他人(例如您未来的自己)甚至有可能必须阅读此代码,那么您肯定会混淆他们的废话。
-
不确定您所说的“基础是在运行时确定的”是什么意思。 Python 是一种解释型语言,一切都是在运行时确定的。
-
@allyourcode,代码示例只是为了演示结果。在允许类名和继承结构独立变化的任何情况下,我都可以达到相同的结果。我只是想知道我是否需要为了稳定而防止这种情况发生。
-
@JoelCornett,在我编写的大多数代码中,我在编辑时确定基数——即。
class Baz(Foo):pass。解释器在运行时设置基础,当然,但在我编辑文件之前,基础基本上是静态的。在这个问题中,我问的是当我编写像return type('Baz',(Foo,) if sunny else (Bar,),{})这样的代码时会发生什么,其中基数由运行时条件决定。
标签: python inheritance types metaclass classname