爲了使一個擴展真的很乾淨,我試圖在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
作者peewee在這裏,我喜歡你想出的API!隨意分叉並回饋您在GitHub上的更改:https://github.com/coleifer/peewee或加入郵件列表groups.google.com/group/peewee-orm – coleifer