Хорошо, я перефразирую свой вопрос, поскольку моя мотивация недостаточно ясна.Свойства динамического питона
У нас есть класс, в котором пользователи будут заполняться свойствами, которые фактически реализованы с использованием более сложных механизмов хранения/поиска. Я упростил это ниже. Предположим, что механизм хранения только простой словарь сейчас:
class MyClass:
def __init__(self, d):
self.mydict = d
def getterX(self):
return self.mydict['X']
def setterX(self, val):
self.mydict['X'] = val
X = property(getterX, setterX)
def getterY(self):
return self.mydict['Y']
def setterY(self, val):
self.mydict['Y'] = val
Y = property(getterY, setterY)
da = {}
Ma = MyClass(da)
Ma.X = 5
Ma.Y = 6
print(Ma.X, Ma.Y) #outputs 5 6
print(da) #outputs {'Y': 6, 'X': 5}
Это работает отлично, за исключением его весьма подвержены ошибкам и многословным. Требуется пять строк не менее экземпляры X, которые необходимо вырезать + вставить для каждого нового объекта. Некоторые из этих классов могут иметь десятки свойств.
Вместо использования макросов (которые я не думаю, что Python поддерживает и неэффективно), я пытаюсь упростить это с некоторыми вспомогательными функциями:
da = {}
class MyHelper:
def __init__(self, dict, label):
self.mydict = dict
self.mylabel = label
def getter2(self, other):
return self.mydict[self.mylabel]
def setter2(self, other, value):
self.mydict[self.mylabel] = value
def makeProperty(d, label):
H = MyHelper(d, label)
return property(H.getter2, H.setter2)
class MyClass:
def __init__(self, d):
self.mydict = d
X = makeProperty(da, 'X') #da is global, but should be self.mydict
Y = makeProperty(da, 'Y') # " " "
Ma = MyClass(da)
Ma.X = 5
Ma.Y = 6
print(Ma.X, Ma.Y) #outputs 5 6
print(da) #outputs {'Y': 6, 'X': 5}
Сейчас этот почти работ, кроме вызовов makeProperty() необходимо получить доступ к глобальной переменной da, вместо использования данных о себе.
Это то место, где я застрял, но я склонен полагать, что это возможно, учитывая, что первый пример кода обращается к данным о собственном члене в его получателях/сеттерах.
Надеюсь, это упростит ситуацию. Спасибо, Роб.
Дополнительная информация:
Я думаю, что это решение не будет работать, так как она появляется на makeProperty вызовы вызывается только один раз, а не один раз в классе конкретизации, как я предполагал.
Итак, есть ли способ сделать эту работу, или пользователь отнесен к значительному разрезанию + вставке?
Что именно вы должны быть? –
Я не понимаю, что вы здесь делаете. Вы можете либо иметь сам класс, либо назначить ему переменные, либо присваивать переменные экземплярам класса. Я не могу думать, что это достигнет этого (потому что это не имеет смысла для меня). Возможно, если вы более подробно объясните, что именно вы пытаетесь достичь, я мог бы быть более полезным. –
Свойство, которое, например, зеркалируется в общем хранилище. – rbairos