4

例如,仍然是下面的方法

def func(value):
     class A:
         x = 2
         def __init__(self, value):
           A.x = value
         def print_x(self):
           print self.x
     return A(value)


a = func(4)
b = func(5)

现在你会发现a.print_x()prints 4。但type(a)会给予'instance'。当类不在范围内时,print_x 方法如何仍然附加到对象?

其次,您会发现在a.print_x()使用新参数再次调用 func 方法时,不会改变的值'5'

调用 func 方法时,python 是否为同一个类创建不同的类对象?

4

2 回答 2

5

在 Python 2.x 中,如果类不继承自其他任何东西,则应始终让它们继承自。object这是因为大约在 Python 2 生命周期的一半左右,所有类都被放置在同一个继承树中(因此一切都是对象)。为了向后兼容,他们不能强迫这种情况发生,所以你必须自己做。

如果您从中A继承,object那么一切正常。请注意,不在主要范围内的事实A并没有说明解释器是否知道它。事实上,解释器知道很多不在主范围内的东西,因为它知道程序中的所有东西

您应该清楚 和 的类ab不同类,都命名为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'>
>>> 
于 2012-08-07T11:21:57.020 回答
0

该类可能不在“范围内”,但该类的实例(在您的情况下,aand b)是。由于对这些对象的引用仍然存在,因此它们不会被垃圾回收。

我建议您阅读 Python 入门书籍以获得更多说明。此外,文档非常好。

于 2012-08-07T11:14:48.273 回答