4
class Test():    
       myVersion="1.0" 
t=Test()   
t.myVersion    
--> 1.0

Test.myVersion="2.0"  
Test.x={'myVersion':'1.0'}
Test.x  
--> {'myVersion': '1.0'}

t.x 
--> {'myVersion': '1.0'}

del t.x
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: Test instance has no attribute 'x'

インスタンスに属性がないのはなぜxですか?
{'myVersion': '1.0'} は帰属ではありませんか?

4

2 に答える 2

5

Python では、classinstance属性の両方にインスタンスからアクセスできます。

http://docs.python.org/2/reference/datamodel.htmlの参照Class instancesは、これがどのように機能するかを明確にします -

クラス インスタンスは、クラス オブジェクトを呼び出すことによって作成されます (上記を参照)。クラス インスタンスには、属性参照が検索される最初の場所であるディクショナリとして実装された名前空間があります。そこに属性が見つからず、インスタンスのクラスにその名前の属性がある場合、検索はクラス属性で続行されます。

Test.__dict__と をそれぞれ使用して、クラスとインスタンスの名前空間を確認できますt.__dict__

興味深いことに、クラス属性をインスタンスから参照して変更しても、クラス属性は影響を受けません。代わりに、変更された属性のコピーがインスタンスの名前空間に追加されます。

例えば、

>>> t = Test()  
>>> t.myVersion = "2.0"  
>>> Test.__dict__
{'__module__': '__main__', 'myversion': '1.0', '__doc__': None}
>>> t.__dict__
{'myVersion': '2.0'}

myVersion属性はTest(クラス) とt(インスタンス) の両方の名前空間に存在するようになり、AttributeError.

基本的な考え方は、オブジェクトから削除しようとしている変数は、その名前空間に存在する必要があるということです。

于 2013-01-20T09:51:01.007 に答える
3

問題は、変数がインスタンスにアタッチされておらず、クラス全体にアタッチされていることです。これを修正するには、インスタンスに物理的にアタッチする必要があります(物理的にではないかもしれませんが、私が言っていることを理解できます)。

class Test:
    def __init__(self):
        self.myVersion = '1.0'

その後、削除できます。

t = Test()
del t.myVersion  # no exception raised
于 2013-01-20T09:20:02.427 に答える