LINUX.ORG.RU

[python] разные возвращаемые значения для одноименного аттрибута класса или объекта класса

 


0

1

Хочу чтобы было так:

class SomeClass(object)
    myattribute = "Class attribute"
    def __init__(self):
       self.myattribute = "object attribute"



>>> print SomeClass.myattribute
Class attribute
>>> print SomeClass().myattribute
object attribute

Понимаю, что нужно хитро написать __setattr__ и __getattr__. Как?

Все это нужно, чтобы сделать класс моделей аля джанга

Зависит от версии пифона.

anonymous
()

> Хочу чтобы было так:

Оно так и есть, в чем проблема?

tailgunner ★★★★★
()

Чтобы сделать «класс моделей а-ля джанга» как следует, придется постараться. См. например базовый класс (точнее, метакласс) моделей.

Я что-то не понял вопроса, кстати. Тот код, который приведен работает именно так, как надо, т.е. при обращении к атрибуту класса отдается «Class attribute», а при обращении к атрибуту объекта класса отдается «object attribute». В чем же проблема?

В любом случае, декларативные объявления, вроде тех, как в django или, там, SQLAlchemy реализовать можно, но не очень просто. Скорее всего, это не будет стоить затраченных сил, если это для реальной системы.

Впрочем, если просто хочется разобраться, как работают метаклассы, вполне можно попробовать, - я в свое время так и сделал. Как именно это делается - можно подсмотреть в Django, - метаклассы для моделей и форм.

shylent
()

Вообще-то, твой код так и будет работать, я не понимаю проблему.

Но если тебе нужно много особой уличной магии, ты их просто сделай дескрипторами.

http://users.rcn.com/python/download/Descriptor.htm

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

d = Article.find(Article.publicationDate < datetime(year=2010, month=9, day=1) and Article.author = myAuthorObject).addCallback(formatArticles)

Короче, find принимает на вход условия, которые паяются в оператор WHERE. И вся штука в том, что мы на вход подаем самые обычные питоньи выражения, которые весьма прозрачно в SQL транслируются.

А где-то внутри функции formatArticles():

def formatArticles(alist):
    for article in alist:
        title = article.title # А здесь уже собственно значение!
                              # это же экземпляр класса, а не сам класс.
shimon ★★★★★
()
Ответ на: комментарий от anonymous

Даа. Я в свое время, когда хотел в этом разобраться, на эту страничку как-то и не наткнулся. Так что просто долго вкуривал исходники моделей + документацию по метаклассам.

shylent
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.