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()今、あなたはプリントを見つけるでしょう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は、インタプリタがそれを知っているかどうかについて何も言わないことに注意してください。実際、インタプリタは、プログラム内のすべてを知っているので、主要な範囲にない多くのことを知っています!

と のクラスが異なるクラスであり、両方とも という名前aであることは明らかです。それらはメインスコープにないため、名前の衝突がないため、それを行うことができます。したがって、 class の各バージョンに 1 つずつ、という2 つのクラス属性があり、一方を変更しても他方を変更する必要はありません。の両方のインスタンスが同じclassを参照するようにするには、(もちろん)グローバルにする必要があります。bAxAAAA

print A.xの代わりに書くつもりprint xだったと思いますので、修正しました。


これは奇妙なことであることに注意してください: class 属性を持つクラスを動的に作成し、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

クラスは「スコープ内」ではない可能性がありますが、そのクラスのインスタンス(あなたの場合はaおよびb)は「スコープ内」にあります。これらのオブジェクトへの参照はまだ存在しているため、ガベージコレクションされません。

より明確にするために、Pythonの入門書を読むことをお勧めします。また、ドキュメントはかなり良いです。

于 2012-08-07T11:14:48.273 に答える