Как создать свойство с его именем в строке? - PullRequest
3 голосов
/ 31 июля 2009

Используя 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"))

Но это не работает. В первом случае бла возвращает значение свойства, во втором случае возвращает свойство <property object at 0xbb1aa0>. Как мне определить, чтобы он работал?

Ответы [ 3 ]

2 голосов
/ 31 июля 2009

Как я бы сказал, разница в том, что в первой версии вы изменяете атрибут классов бла на результат свойства, а во второй вы устанавливаете его в экземпляре (который отличается!).

Как насчет этой версии:

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 голос
/ 31 июля 2009

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

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

1 голос
/ 31 июля 2009

Один из способов - написать в localals ():

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
...