2

クラスAとクラスBの違いは何ですか?

自己の何が問題になっていますか?

なぜ行ごとに自己宣言する必要があるのですか?

class A(dict):
  def __init__(self):
    self={1:"you", 2:"and me"}
    print "inside of class A",self
class B(dict):
  def __init__(self):
    self[1]="you"
    self[2]="and me"
    print "inside of class B",self

a=A()
print "outside of class A",a
b=B()
print "outside of class B",b

結果:

inside of class A {1: 'you', 2: 'and me'}
outside of class A {}
inside of class B {1: 'you', 2: 'and me'}
outside of class B {1: 'you', 2: 'and me'}
4

4 に答える 4

9
  def __init__(self):
    self={1:"you", 2:"and me"}

これは、として渡されたオブジェクトを変更しませんが、ローカル変数を新しいdictにself再バインドします。self

于 2012-10-31T18:18:26.577 に答える
4

他の人が言ったように、に割り当てることselfは、構築されているdictに影響を与えることなく、ローカル変数の値を変更するだけなので、役に立ちません。あなたが欲しいものは次のようなものです:

self.update({1:"you", 2:"and me"})

あるいは:

dict.__init__(self, {1:"you", 2:"and me"})

クラスコンストラクタが返すインスタンスを本当に制御したい場合(たとえば、インスタンスキャッシングを実装するため)、を調べて__new__ください。

于 2012-10-31T18:27:10.303 に答える
2

selfクラスAでは、ローカル変数に割り当てています。が__init__呼び出されると、self参照が含まれるため、構築されたオブジェクト。あなたはそれを他の何かに完全に再割り当てしています。これはクラスAのインスタンスをまったく変更しません

self実際、クラスAで新しいメソッドを定義すると、割り当てたdictがそこにも表示されないことに気付くでしょう。__init__戻った瞬間、それは参照されなくなりました。

于 2012-10-31T18:18:35.413 に答える
0

他の良い答えに追加するだけです。バイトコードの違いを確認できます。

のバイトコードA

Disassembly of __init__:
  3           0 BUILD_MAP                2
              3 LOAD_CONST               1 ('you')
              6 LOAD_CONST               2 (1)
              9 STORE_MAP           
             10 LOAD_CONST               3 ('and me')
             13 LOAD_CONST               4 (2)
             16 STORE_MAP           
             17 STORE_FAST               0 (self)  # stores values in local variable
                                                   # i.e not changing the object at all

  4          20 LOAD_CONST               5 ('inside of class A')
             23 PRINT_ITEM          
             24 LOAD_FAST                0 (self)
             27 PRINT_ITEM          
             28 PRINT_NEWLINE       
             29 LOAD_CONST               0 (None)
             32 RETURN_VALUE        

None

のバイトコードB

Disassembly of __init__:
  8           0 LOAD_CONST               1 ('you')
              3 LOAD_FAST                0 (self)  #loads self, i.e instance of dict
              6 LOAD_CONST               2 (1)
              9 STORE_SUBSCR                       #store value in it   

  9          10 LOAD_CONST               3 ('and me')
             13 LOAD_FAST                0 (self)
             16 LOAD_CONST               4 (2)
             19 STORE_SUBSCR        

 10          20 LOAD_CONST               5 ('inside of class B')
             23 PRINT_ITEM          
             24 LOAD_FAST                0 (self)
             27 PRINT_ITEM          
             28 PRINT_NEWLINE       
             29 LOAD_CONST               0 (None)
             32 RETURN_VALUE        

None
于 2012-10-31T18:34:46.117 に答える