Можно ли перегрузить оператор как метод класса в 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'

Исходная информация:

Я пытаюсь реализовать представления в ORM 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
6
задан Helgi 4 June 2012 в 09:35
поделиться