Python 类对象(非实例)的比较运算符
在我当前的项目中,我发现声明子类(类似于Django的Python 类对象(非实例)的比较运算符,python,python-3.x,Python,Python 3.x,在我当前的项目中,我发现声明子类(类似于Django的Model语法)比创建基本对象的实例更清晰、更符合逻辑。在保持简单易读的前提下,我还想向父类添加比较器。下面是一个简单的例子来说明情况: from functools import total_ordering @total_ordering class Version(): VERSIONNUMBER = None def __eq__(self, other): try: ## catch issubc
Model
语法)比创建基本对象的实例更清晰、更符合逻辑。在保持简单易读的前提下,我还想向父类添加比较器。下面是一个简单的例子来说明情况:
from functools import total_ordering
@total_ordering
class Version():
VERSIONNUMBER = None
def __eq__(self, other):
try: ## catch issubclass(instance, Version)
if issubclass(other, Version): return self.VERSIONNUMBER == other.VERSIONNUMBER
except TypeError: pass
return NotImplemented
def __lt__(self, other):
try:
if issubclass(other, Version): return self.VERSIONNUMBER < other.VERSIONNUMBER
except TypeError: pass
return NotImplemented
class Version1(Version):
VERSIONNUMBER = 1.0
class Version2(Version):
VERSIONNUMBER = 2.0
assert Version2 > Version1
从functools导入总排序
@总订单
类版本():
版本号=无
定义(自身、其他):
try:##catch issubclass(实例,版本)
如果issubclass(其他,版本):返回self.VERSIONNUMBER==other.VERSIONNUMBER
除了类型错误:通过
返回未执行
定义(自身、其他):
尝试:
如果issubclass(其他,版本):返回self.VERSIONNUMBER版本1
但是,这会在“type”和“type”的实例之间抛出TypeError:“>”不受支持。
我尝试过的事情
经过思考,我理解这意味着丰富的比较方法是从type
(其中object
/class是的一个实例)调用的,因此像向比较方法添加classmethod
装饰器这样的简单修复没有任何作用。创建一个可排序的超类显然也是错误的,因为这只是类型
的另一个实例,因此仍然会调用类型
的比较器。我不认为这是一个可以用元类实现的东西,但我对它们不够流利,不能绝对肯定地说
我的搜索通常返回不相关的主题:
- “TypeError[etc]”返回所有通用的“警告:我不知道你是否能得到
total_ordering
,在这里玩得好
但是让比较方法在类上工作的一种方法是使用元类,而不是从父类继承它们。例如:
class Version_Meta(type):
def __eq__(self, other):
try:
return self.VERSIONNUMBER == other.VERSIONNUMBER
except TypeError: pass
return NotImplemented
def __lt__(self,other):
try:
return self.VERSIONNUMBER < other.VERSIONNUMBER
except TypeError: pass
return NotImplemented
class Version(metaclass=Version_Meta):
VERSIONNUMBER = None
class Version1(Version):
VERSIONNUMBER = 1.0
class Version2(Version):
VERSIONNUMBER = 2.0
Version1 < Version2
# True
Version2 < Version1
# False
类版本\元(类型):
定义(自身、其他):
尝试:
返回self.VERSIONNUMBER==其他.VERSIONNUMBER
除了类型错误:通过
返回未执行
定义(自身、其他):
尝试:
返回self.VERSIONNUMBER
与Version1=Version(1.0)
相比,class Version1(Version):VERSIONUMBER=1.0
更容易阅读吗?只需使用实例而不是子类。非常感谢!total\u ordering
在进行比较时抛出一个错误,表示缺少一个参数(V1