2009-07-31 1 views
3

Использование 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>. Как я могу определить его так, чтобы он работал?

+0

Обычно мы определяем свойство с фиксированным, очевидным, инвариантным именем. Затем мы используем getattr для гибкого сопоставления свойств. Что вы пытаетесь сделать с этим? Какая картина? Вероятно, есть более простой способ; пожалуйста, предоставьте фон, чтобы мы могли предложить что-то, что действительно сработает. –

+0

Я создаю класс для хранения конфигурации процесса, и у него будет тонна свойств, очень похожих на то, как они установлены, получают, проверяются, документируются и т. Д. Я пытаюсь удалить дублирование кода. – Pablo

+0

@J. Пабло Фернандес: Пожалуйста, обновите свой вопрос. Комментарии не являются местом для размещения важной информации. Похоже, вы просто говорите о классе, который обертывает словарь значений свойств. Но вам нужно предоставить некоторые сведения о вашем случае использования. Больше, чем вы можете вставить в комментарий. Это ваш вопрос; обновите его, пожалуйста. –

ответ

2

Насколько я бы сказал, разница в том, что в первой версии вы меняете атрибут класса 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")) 
1

Один из способов это написать в местных():

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 
1

Если я понимаю, что вы пытаетесь сделать, вы могли бы добиться этого с помощью переопределения класса getattr и 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 

Таким образом, вы можете иметь общий геттер и сеттер, который имеет имя свойства в строке и делает что-то с ним, соответственно, ,

 Смежные вопросы

  • Нет связанных вопросов^_^