Чтобы сделать расширение действительно чистым, я пытаюсь реализовать оператор «>>» в python как метод класса. Я не уверен, как это сделать. Я не хочу создавать экземпляр, так как я действительно работаю над самим классом.Может ли оператор быть перегружен как метод класса в python?
>>> class C:
... @classmethod
... def __rshift__(cls, other):
... print("%s got %s" % (cls, other))
...
>>> C.__rshift__("input")
__main__.C got input
>>> C() >> "input"
__main__.C got input
>>> C >> "input"
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for >>: 'classobj' and 'str'
Справочная информация:
Я пытаюсь реализовать мнения в Peewee ОРМ (по аналогии с Django). Peewee позволяет определять таблицы базы данных и их отношения как классы, так как:
class Track(Model):
title = CharField()
artist = ForeignKeyField(Artist)
class Artist(Model):
name = CharField(unique = True)
location = ForeignKeyField(Location)
class Location(Model):
state = CharField(size = 2)
city = CharField()
Примечание: Для большей наглядности порядок обратный.
Я пытаюсь расширить это с помощью реализации представлений. Одна из самых сложных частей - это простой способ указать соединения. До сих пор я реализовал следующее:
class Song(View):
title = Track.title
artist = Track.artist >> "name"
state = Track.artist >> "location" >> "state"
Это нормально, но я действительно хотел бы устранить «.». для дальнейшего упрощения:
class Song(View):
title = Track >> "title"
artist = Track >> "artist" >> "name"
state = Track >> "artist" >> "location" >> "state"
Какой бы вы предпочли использовать? Или оба?
Как сторона примечания, может ли кто-нибудь подумать о хорошем способе указать обратное соединение? Что-то вроде следующего немного неудобно для меня:
class LocWithSong(View):
state = Location >> "state"
title = Location >> Track.title
Автор peewee здесь, мне нравится API, который вы придумали! Не стесняйтесь вилки и внесите свои изменения в GitHub: https://github.com/coleifer/peewee или присоединитесь к списку рассылки, groups.google.com/group/peewee-orm – coleifer