Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 类对象(非实例)的比较运算符_Python_Python 3.x - Fatal编程技术网

Python 类对象(非实例)的比较运算符

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

在我当前的项目中,我发现声明子类(类似于Django的
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