2012-10-10 62 views
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'> 

看到,它的類型是不海峽,但A類

+0

我敢肯定,你不能這樣做(幾乎所有的編程語言)。不知道_why_雖然。 –

+0

這是一個非常糟糕的設計模式......其中之一就是因爲你不能代表你應該......更好的選擇是尋找工廠設計模式 –

+0

@macek它實際上是可能的...... –

回答

0

這是一個可怕的想法......我不主張永遠做這個......其實你應該避免不惜一切代價......看看使用工廠設計模式,而不是...

>>> class A: 
... def swap(self): 
...  self.__class__ = B 
... 
>>> class B: 
... pass 
... 
>>> a = A() 
>>> a.swap() 
>>> a 
<__main__.B instance at 0x02C43E18> 
>>> 
+2

yuck!射殺一個人,他已經死了。教一個人自己開槍,而且你甚至不需要進監獄! – wim

+0

我同意......但它確實回答了這個問題......我在開始時就提出了一個相當不錯的免責聲明...... –

3

你弄糊塗了 - 有在這裏使用self = 'I am swapped'來重新綁定名稱沒有什麼特別之處,您只需將self分配給字符串對象,並且它在此處充當本地變量。你根本不會改變父對象。

這裏是證明:

>>> class A(object): 
... def swap(self): 
...  print id(self) 
...  self = 'I am a different object now' 
...  print id(self) 
... 
>>> abc = A() 
>>> id(abc) 
139677585341456 
>>> abc.swap() 
139677585341456 
139677585341296 
>>> id(abc) 
139677585341456 

順便說一句,你甚至不必用這個詞self的成員函數的第一個參數。這只是python人使用的命名約定,但它也可以與其他變量名一起使用。

0

self是一個慣例。一個類的實例是在第一個參數中交給它的函數的東西,你可以隨心所欲地調用它,並且你可以對你的特定函數中的本地名稱空間進行任何你喜歡的操作。請參閱:

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

所以,是的,你可以在一個類的方法操縱self,但由於self本身並不真正意味着什麼,有沒有真正的點。你應該(不)按照喬蘭的建議。