我正在编写一个Python脚本来解析一些数据。目前我正在尝试创建一个类来创建“占位符”对象。我打算反复传递每个“placeholder”变量,最后将其转换为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 )
我想做的是:
^{pr2}$…把“e”变成一个浮子。在
我希望避免的是:
e = Event()
e.augmentA( 1 )
e.augmentA( 2 )
e = e.getSealedValue()
我完全理解我的“seal”方法中的self“只是一个局部变量,不会对范围外的实例产生任何影响。但是,我不确定如何从实例中实现我想要的,在哪里对我的代码最方便。我也知道我可以覆盖所有bulit-in(getItem,toStr),但这会使我的代码复杂化很多。在
我是一个Python呆子,所以我不确定这是否可能。请容我一下:)
即使有某种合理的方法可以使它工作,我也会避免走这条路,因为它将对象的类型更改为与现有契约完全不兼容的对象。在
现在,有人可以说“但是我只在一个地方使用它,其他代码路径永远看不到旧的契约”,但不幸的是,这并不是这种机制的一个参数,因为只有在拥有最终对象之后,您才可以将该值用于其他代码路径。在
简言之,不要这样做,甚至不要尝试。在
在某些情况下,Python允许您动态地更改对象的类。但是,并不是任何对象都可以转换为任何类,如下例所示(为了可读性,添加了新行):
(我不知道确切的规则是什么,但是如果你的类使用
__slots__
的话,它们必须兼容才能进行转换)然而,正如其他回答者所指出的,总的来说,这样做是一个非常糟糕的主意,即使有一种方法可以将对一个对象的每个引用转换为对另一个对象的引用。我不会说从不那么做,但是,这种技术可能有合法的用途(例如,我认为它是实现State Design Pattern的一种简单方法,而不会造成不必要的混乱)。在
不,不能通过对变量值调用方法来替换变量值本身。通常的做法是这样的:
e = e.getSealedValue()
你可以让一个对象改变行为,但这通常被认为是一个坏主意,很可能导致代码高度不可维护。在
相关问题 更多 >
编程相关推荐