2

次のようなものがあるのだろうか:

>>> class A(object):
...     def swap(self):
...         self = 'I am swapped'
... 
>>> abc=A()
>>> abc
<__main__.A object at 0x028B6130>
>>> abc.swap
<bound method A.swap of <__main__.A object at 0x028B6130>>
>>> abc.swap()
>>> abc
<__main__.A object at 0x028B6130>
>>> type(abc)
<class '__main__.A'>

タイプは str ではなく、クラス A です。

4

3 に答える 3

3

あなたは混乱しています - を使用して名前を割り当てることについて特別なことは何もありません

self = 'I am swapped'

selfこれは名前を文字列オブジェクトにバインドしているだけで、ここではローカル変数として機能しています。親オブジェクトをまったく変更していません。

実際、Python は強く型付けされた言語であるため、試みたものは Python では使用されません。代わりに、swap値を返してから、同じ変数名を外側のスコープで返されたオブジェクトに再割り当てします。

おそらく、これは次の代わりにコードで説明する方が簡単です。

a.swap()

次のようになります。

a = a.swap()
于 2012-10-10T00:03:26.343 に答える
1

selfは慣例です。クラスのインスタンスは、最初の引数でその関数に渡されるものであり、好きなように呼び出すことができ、特定の関数のローカル名前空間に対して好きなことを行うことができます。見る:

>>> class A:
...     def f(hats):
...         print hats
... 
>>> a = A()
>>> a.f()
<__main__.A instance at 0x100466908>

そうですself、クラスメソッドで操作することはできますが、selfそれ自体は実際には何も意味しないため、実際の意味はありません。Joranが提案したことをするべきです(すべきではありません)。

于 2012-10-10T00:12:47.697 に答える
0

これはひどい考えです...私はこれを行うことを決して支持しません...実際、絶対に避けるべきです...代わりにFactoryデザインパターンを使用することを検討してください...

>>> class A:
...    def swap(self):
...      self.__class__ = B
...
>>> class B:
...   pass
...
>>> a = A()
>>> a.swap()
>>> a
<__main__.B instance at 0x02C43E18>
>>>
于 2012-10-10T00:05:28.807 に答える