2012-05-27 38 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 ORM意見(類似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