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 中使用,因为它是一种强类型语言。相反,您只需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

这是一个糟糕的主意......我不提倡这样做......事实上你应该不惜一切代价避免......看看使用工厂设计模式......

>>> 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 回答