Вопрос

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top