在 Python 2.x 中,如果类不继承自其他任何东西,则应始终让它们继承自。object
这是因为大约在 Python 2 生命周期的一半左右,所有类都被放置在同一个继承树中(因此一切都是对象)。为了向后兼容,他们不能强迫这种情况发生,所以你必须自己做。
如果您从中A
继承,object
那么一切正常。请注意,不在主要范围内的事实A
并没有说明解释器是否知道它。事实上,解释器知道很多不在主范围内的东西,因为它知道程序中的所有东西!
您应该清楚 和 的类a
是b
不同的类,都命名为A
. 您可以这样做,因为它们不在主要范围内,因此没有名称冲突。因此有两个类属性称为x
,每个版本都有一个 class A
,因此没有理由更改一个应该修改另一个。如果您希望 的两个实例都A
引用同一个类A
,则(当然)应该将其设为A
全局!
我假设您打算写print A.x
而不是print x
,所以我为您解决了这个问题。
请注意,这是一件奇怪的事情:您正在动态地创建一个具有类属性的类x
,实例化它,然后返回带有类变量的实例。你确定你不想在里面做self.x = value
,__init__
并且摆脱掉线x = 2
吗?
Python 2.7.2 (default, Jun 20 2012, 16:23:33)
[GCC 4.2.1 Compatible Apple Clang 4.0 (tags/Apple/clang-418.0.60)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> def f(value):
... class A(object):
... x = 2
... def __init__(self, value):
... A.x = value
... def print_x(self):
... print A.x
... return A(value)
...
>>> a = f(4)
>>> b = f(5)
>>>
>>> a.print_x()
4
>>> b.print_x()
5
>>> a
<__main__.A object at 0x10e2e1ed0>
>>> A
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'A' is not defined
>>> a
<__main__.A object at 0x10e2e1ed0>
>>> b
<__main__.A object at 0x10e2e1fd0>
>>> type(a)
<class '__main__.A'>
>>>