我正在编写一个 Python 脚本来解析一些数据。目前我正在尝试制作一个创建“占位符”对象的类。我打算重复传递每个“占位符”变量,最后把它变成一个字典、 float 、列表或字符串。由于需要花一些时间来描述的原因,如果我可以通过调用方法来替换实例会容易得多。
这是一个简单的例子
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”变成一个 float 。
我希望避免的是:
e = Event()
e.augmentA( 1 )
e.augmentA( 2 )
e = e.getSealedValue()
我完全理解我的“seal”方法中的“self”只是一个局部变量,不会对作用域外的实例产生任何影响。但是,我不确定如何从实例中实现我想要的,这对我的代码来说是最方便的。我也知道我可以覆盖所有内置插件(getItem、toStr),但这会使我的代码复杂化很多。
我是 Python 菜鸟,所以我不确定这是否可行。请放纵我:)
最佳答案
在某些情况下,Python 允许您即时更改对象的类。但是,any 对象不能转换为any 类,如以下示例所示(添加换行符以提高可读性):
>>> 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/