通过实例方法操作实例本身

时间:2012-10-10 00:00:46

标签: python class self

我想知道是否有类似的东西, 说:

>>> 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类。

3 个答案:

答案 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家伙使用的命名约定,但它也可以与其他变量名一起使用。

答案 1 :(得分:0)

这是一个可怕的想法......我不主张这样做......实际上你应该不惜一切代价避免...看看使用工厂设计模式而不是......

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

答案 2 :(得分:0)

self是一项惯例。类的一个实例是在第一个参数中传递给它的函数,你可以随意调用它,你可以对你特定函数中的本地命名空间做任何你喜欢的事情。参见:

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

所以是的,你可以在类方法中操纵self,但由于self本身实际上并不意味着什么,所以没有真正的意义。你应该(不)做Joran所建议的。