sdo*_*obz 6 python class operator-overloading peewee
为了使扩展看起来很干净,我试图在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'
Run Code Online (Sandbox Code Playgroud)
背景资料:
我试图在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()
Run Code Online (Sandbox Code Playgroud)
注意:为清楚起见,订单是相反的.
我试图通过视图的实现来扩展它.其中一个最困难的部分是设置一个干净的方式来指示连接.到目前为止,我已实施以下内容:
class Song(View):
title = Track.title
artist = Track.artist >> "name"
state = Track.artist >> "location" >> "state"
Run Code Online (Sandbox Code Playgroud)
这没关系,但我真的想消除"." 进一步简化:
class Song(View):
title = Track >> "title"
artist = Track >> "artist" >> "name"
state = Track >> "artist" >> "location" >> "state"
Run Code Online (Sandbox Code Playgroud)
你宁愿用哪个?或两者?
作为旁注,任何人都可以想出一个指示向后加入的好方法吗?像下面这样的东西对我来说有点尴尬:
class LocWithSong(View):
state = Location >> "state"
title = Location >> Track.title
Run Code Online (Sandbox Code Playgroud)
在元类上定义方法.
class MC(type):
def __rshift__(self, other):
return something(self, other)
class C(object):
__metaclass__ = MC
print C >> None
Run Code Online (Sandbox Code Playgroud)