【问题标题】:manipulating instance itself by its instance methods通过实例方法操作实例本身
【发布时间】:2012-10-10 00:00:46
【问题描述】:

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

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

【问题讨论】:

  • 我很确定你不能这样做(几乎在任何编程语言中)。不确定为什么
  • 这是一个非常糟糕的设计模式......其中一个只是因为你不能意味着你应该......更好的选择是研究工厂设计模式
  • @macek 实际上是可能的......
  • 为了清楚起见,您说的是 instance 方法。

标签: python class self


【解决方案1】:

您很困惑 - 使用

分配名称并没有什么特别之处
self = 'I am swapped'

这只是将名称self 绑定到一个字符串对象,它在此处充当局部变量。您根本没有改变父对象。

事实上,您尝试的内容并未在 Python 中使用,因为它是一种强类型语言。相反,您只需让swap 返回一个值,然后将相同的变量名重新分配给外部作用域中的返回对象。

也许这更容易用代码来解释,而不是:

a.swap()

你会:

a = a.swap()

【讨论】:

    【解决方案2】:

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

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

    所以是的,您可以在类方法中操作self,但由于self 本身实际上并没有任何意义,因此没有任何意义。你应该(不)按照 Joran 的建议去做。

    【讨论】:

      【解决方案3】:

      这是一个糟糕的主意...我不提倡这样做...实际上您应该不惜一切代价避免...考虑改用工厂设计模式...

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

      【讨论】:

      • 我同意......但它确实回答了这个问题......而且我在开头放了一个很好的免责声明......
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-10-27
      • 1970-01-01
      • 2016-08-30
      • 2011-05-28
      • 2020-07-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多