2012-05-27 2 views
4

Чтобы сделать расширение действительно чистым, я пытаюсь реализовать оператор «>>» в 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 
+0

Автор peewee здесь, мне нравится API, который вы придумали! Не стесняйтесь вилки и внесите свои изменения в GitHub: https://github.com/coleifer/peewee или присоединитесь к списку рассылки, groups.google.com/group/peewee-orm – coleifer

ответ

5

Определение метода on the metaclass.

class MC(type): 
    def __rshift__(self, other): 
    return something(self, other) 

class C(object): 
    __metaclass__ = MC 

print C >> None 
+0

Спасибо, я никогда бы не подумал что. Это очень сложно найти, все, что я видел, привлекло нерелевантную информацию в отношении стандартной перегрузки. Спасибо за быстрый ответ. – sdobz

 Смежные вопросы

  • Нет связанных вопросов^_^