Python 2.x では、他のクラスから継承しない場合は、常にクラスを継承する必要があります。object
これは、Python 2 の寿命のほぼ半分で、すべてのクラスが同じ継承ツリーに配置されたためです (すべてがオブジェクトになるように)。下位互換性のために、これを強制することはできないため、自分で行う必要があります。
A
継承を行うとobject
、すべてが機能します。がメインスコープにないという事実A
は、インタプリタがそれを知っているかどうかについて何も言わないことに注意してください。実際、インタプリタは、プログラム内のすべてを知っているので、主要な範囲にない多くのことを知っています!
と のクラスが異なるクラスであり、両方とも という名前a
であることは明らかです。それらはメインスコープにないため、名前の衝突がないため、それを行うことができます。したがって、 class の各バージョンに 1 つずつ、という2 つのクラス属性があり、一方を変更しても他方を変更する必要はありません。の両方のインスタンスが同じclassを参照するようにするには、(もちろん)グローバルにする必要があります。b
A
x
A
A
A
A
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'>
>>>