我想知道是否有类似的东西, 说:
>>> 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类。
答案 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所建议的。