Как создать свойство с его именем в строке?
-
06-07-2019 - |
Вопрос
Используя Python, я хочу создать свойство в классе, но имеющее его имя в виде строки.Обычно ты так и делаешь:
blah = property(get_blah, set_blah, del_blah, "bleh blih")
где get_, set_ и del_blah были определены соответствующим образом.Я попытался сделать то же самое с именем свойства в переменной, например, так:
setattr(self, "blah", property(self.get_blah, self.set_blah, self.del_blah, "bleh blih"))
Но это не работает.В первом случае blah возвращает значение свойства, во втором случае оно возвращает свойство, то есть <property object at 0xbb1aa0>
.Как я должен определить это, чтобы это работало?
Решение
Как я бы сказал, разница в том, что в первой версии вы меняете атрибут классов blah на результат свойства, а во второй вы устанавливаете его в экземпляре (который отличается!).
Как насчет этой версии?
setattr(MyClass, "blah", property(self.get_blah, self.set_blah,
self.del_blah, "bleh blih"))
вы также можете сделать это:
setattr(type(self), "blah", property(self.get_blah, self.set_blah,
self.del_blah, "bleh blih"))
Другие советы
Один из способов - записать в locals():
class X:
for attr in ["a","b","c"]:
def getter(self, name=attr):
return name+"_value"
locals()[attr] = property(getter, None, None, attr)
x = X()
print x.a
print x.b
print x.c
дает
a_value
b_value
c_value
Если я понимаю, что вы пытаетесь сделать, вы можете выполнить это путем переопределения класса getattr и < strong> setattr .
Например:
class Something(object):
def __getattr__(self, name):
# The name of the property retrieved is a string called name
return "You're getting %s" % name
something = Something()
print something.foo
print something.bar
Напечатает:
You're getting foo
You're getting bar
Таким образом, вы можете иметь универсальный метод получения и установки, который имеет имя свойства в строке и что-то делает с ним соответствующим образом.