Я ищу способ установить значение строки без изменения типа строки.
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 = "что угодно", но я не хочу вручную копировать значения myattr и многое другое, если я добавлю больше переменных в класс testStr.
РЕДАКТИРОВАТЬ: Вот решение, которое я в конечном итоге придумал. Это удовлетворяет всем моим потребностям, я надеялся на что-то более элегантное, но тем не менее, я доволен этим:
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
Это позволяет использовать параметр конфигурации в качестве строки, однако он все равно содержит дополнительную информацию, если она была необходима.