我正在寻找一种在不改变字符串类型的情况下设置字符串值的方法。
class testStr(str):
myattr = ""
# this works fine.
t = testStr("testing")
t.myattr = "Yay!"
print "String value is: '" + t + "' and its attr is set to '" + t.myattr + "'"
# obviously once this is done the type of t goes back to str
# and I lose the value of .myattr
t = "whatever"
如果可能的话,我希望myattr在字符串设置为新值时保持它的值。它不需要像t =“what”那样工作,但如果我将更多变量放入testStr类中,我不想手动复制myattr的值等等。
编辑:以下是我最终提出的解决方案。它满足了我所有的需求,我希望有一些更优雅的东西,但我对此感到高兴:
class config:
class ConfigItem(str):
def __init__(self, value):
super( str, self ).__init__()
self.var1 = "defaultv1"
self.var2 = "defaultv2"
def __init__(self):
self.configTree = {}
def __getitem__(self, key):
if ( self.configTree.has_key(key) ):
return self.configTree[key]
return ""
def __setitem__(self, key, value):
if ( value.__class__.__name__ == "ConfigItem" ):
self.configTree[key] = value
return
if ( value.__class__.__name__ == "str" ):
item = None
if ( self.configTree.has_key(key) ):
item = self.configTree[key]
new_item = self.ConfigItem(value)
for attr in item.__dict__:
new_item.__setattr__(attr, item.__getattribute__(attr))
self.configTree[key] = new_item
else:
item = self.ConfigItem(value)
self.configTree[key] = item
# test it out
cfg = config()
cfg["test_config_item"] = "it didn't work."
cfg["test_config_item"].var1 = "it worked!"
cfg["test_config_item"] = "it worked!"
print cfg["test_config_item"]
print cfg["test_config_item"].var1
这允许将配置设置用作字符串,但如果需要,它仍然包含附加信息。
答案 0 :(得分:2)
语句t = "whatever"
不会“更改t
包含的值”,而是将t
重新绑定到其他对象。如果要更改t
,则必须通过属性(通过分配属性或通过调用方法)来改变它。
答案 1 :(得分:1)
问题(你已经想到)是t被分配给str类型的新对象,它没有myattr。
我认为最简单的方法是简单地创建一个不从str继承的类,但包含一个字符串成员以及'myattr'
答案 2 :(得分:0)
你可能会考虑这种方法。它似乎提供了您正在寻找的功能。
class testStr(object):
def __init__(self, string, myattr = ""):
self.string = string
self.myattr = myattr
运行与您展示的相同的测试用例。
>>> from testStr import testStr
>>> t = testStr('testing')
>>> t.string
'testing'
>>> t.myattr = 'Yay!'
>>> t.myattr
'Yay!'
>>> t.string = 'whatever'
>>> t.string
'whatever'
>>> t.myattr
'Yay!'
或者,如果你真的想从str继承(但这不是pythonic,也不能解决你的问题):
class testStr(str):
def __init__(self, string, myattr = ""):
super(testStr, self).__init__(string)
self.myattr = myattr
答案 3 :(得分:0)
为什么不使用元组或列表?
>>> s = [ ["the string", 15], ["second string", 12] ]
>>> print s
[['the string', 15], ['second string', 12]]
>>> s[0][1] = 8;
>>> print s
[['the string', 8], ['second string', 12]]
>>> print s[0]
['the string', 8]
>>> print s[1]
['second string', 12]