我正在编写一个Python脚本来解析一些数据。目前,我正在尝试创建一个类来创建“占位符”对象。我打算反复传递每个“占位符”变量,最后将其转换为dict、float、list或string。由于需要一段时间来描述的原因,如果我可以通过调用一个方法来替换实例,那会容易得多。
下面是一个简单的例子

class Event( dict ):

    def __init__( self ):

        self.sumA = 0.0
        self.sumB = 0.0

    def augmentA( self, i ):

        self.sumA += i

    def augmentB( self, i ):

        self.sumB += i

    def seal( self ):

        if self.sumA != 0 and self.sumB != 0:
            self = [ sumA, sumB ]

        elif self.sumA != 0:
            self = float( sumA )

        elif self.sumB != 0:
            self = float( sumB )

我想做的是:
e = Event()
e.augmentA( 1 )
e.augmentA( 2 )
e.seal()

…把“e”变成一个浮子。
我希望避免的是:
e = Event()
e.augmentA( 1 )
e.augmentA( 2 )
e = e.getSealedValue()

我完全理解“seal”方法中的“self”只是一个局部变量,不会对范围外的实例产生任何影响。但是,我不确定如何从实例中实现我想要的,对我的代码来说最方便的地方。我也知道我可以重写所有的bulit-ins(getItem,toStr),但这会使我的代码复杂很多。
我是个蟒蛇迷,所以我不确定这是否可能。请原谅我:)

最佳答案

在某些循环下,Python允许您动态更改对象的类。但是,没有任何对象可以转换为任何类,如下例所示(为可读性添加了新行):

>>> class A(object):
...   pass
...
>>> class B(object):
...   pass
...
>>> a = A()
>>> type(a)
<class '__main__.A'>

>>> a.__class__ = B
>>> type(a)
<class '__main__.B'>

>>> a.__class__ = int
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: __class__ assignment: only for heap types

(我不知道确切的规则,但如果您的类使用__slots__例如,它们必须兼容才能进行转换)
然而,正如其他回答者所指出的,一般来说,这样做是一个非常糟糕的主意,即使有一种方法可以将对一个对象的每个引用转换为对另一个对象的引用。不过,我不会说永远不要这样做,这项技术可能有合法的用途(例如,我认为这是一种实现State Design Pattern而不产生不必要的混乱的简单方法)。

关于python - 用实例方法中的float替换实例?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11919780/

10-14 16:50
查看更多