Я работаю в более крупном модуле python, где могут быть сохранены «проекты», содержащие сборки экземпляров класса, похожих на dict, но для сохранения атрибутов класса они должны храниться в определенном словаре в классе.Я могу сделать мои атрибуты доступными в виде простых атрибутов (self.x
вместо self.properties['x']
), записав их как свойства.Но у меня до 9 таких вещей, и предоставление каждому из них методов получения, установки и удаления кажется такой пустой тратой пространства, тем более что они все такие тривиальные.Есть ли лучший способ?
Слишком долго:
class MyClass(dict):
@property
def variable1(self):
return self.properties.get('variable1', None)
@variable1.setter
def variable1(self, value):
self.properties['variable1'] = value
@variable1.deleter
def variable1(self):
self.properties['variable1'] = None
# ... same for variables 2 - 8, so boring
@property
def variable9(self):
return self.properties.get('variable9', None)
@variable9.setter
def variable9(self, value):
self.properties['variable9'] = value
@variable9.deleter
def variable9(self):
self.properties['variable9'] = None
def __init__(self, variable1='default1', variable9='default9'):
self.properties = dict(variable1=variable1, variable9=variable9)
dict.__init__(self)
Как можно перебрать объявления свойств, чтобы они были короче?
БОНУС: Если я делаю цикл, есть ли способ включить незначительные настройки для некоторых переменных, если возникнет такая необходимость (может быть, объявить вещи для перечисления в качестве ключей в словаре, где значения являются инструкциями длянезначительные настройки)?
Тестирование / использование приведенного выше примера:
from var_test import MyClass # If you saved it in var_test.py
a = MyClass(variable1=1234)
b = MyClass(variable1='wheee')
assert a.variable1 is not b.variable1
assert a.properties['variable1'] == a.variable1
assert a.variable1 == 1234