Python 比较对象的字符串表示形式与列表中每个对象的字符串表示形式

Python 比较对象的字符串表示形式与列表中每个对象的字符串表示形式,python,oop,Python,Oop,是否有一种简单的方法将对象的字符串表示形式与列表中的每个对象进行比较 下面的示例代码(Python2.7)按预期工作,但我认为在Python中有一种更好的方法来实现这一点 class url(object): def __init__(self, address): self.address = address def __str__(self): return self.address list_of_urls = [url('http://w

是否有一种简单的方法将对象的字符串表示形式与列表中的每个对象进行比较

下面的示例代码(Python2.7)按预期工作,但我认为在Python中有一种更好的方法来实现这一点

class url(object):
    def __init__(self, address):
       self.address = address

    def __str__(self):
        return self.address

list_of_urls = [url('http://www.example.foo'), url('http://www.example.bar')]
test_url = url('http://www.example.foobar')

test_url_listed = False
for link in list_of_urls:
    if str(test_url) == str(link):
        test_url_listed = True

if not test_url_listed:
    list_of_urls.append(test_url)
是否有可能使其结构更接近以下内容

if test_url not in list_of_urls:
    list_of_urls.append(test_url)
(实际上,这是失败的,因为它比较的是对象,而不是它们所表示的字符串。)


或者更好的是,在url类上实现和/或+。(可能还有。)然后您可以创建一组URL,自动确保没有重复的URL。

最快的方法是实现
\u cmp\u
方法

class url(object):
    def __init__(self, address):
       self.address = address

    def __str__(self):
        return self.address

    def __cmp__(self, other):
        return cmp(self.address, other.address)


list_of_urls = [url('http://www.example.foo'), url('http://www.example.bar')]
test_url = url('http://www.example.foobar')
这包括:

if test_url not in list_of_urls:
    print("Not in")
打印“不在”

或者,您可以使用“丰富的”比较,但这需要更多的努力。
total_ordering
class方法会有所帮助

from functools import total_ordering

@total_ordering
class url(object):
    def __init__(self, address):
       self.address = address

    def __str__(self):
        return self.address

    def __eq__(self, other):
        return self.address == other.address

    def __lt__(self, other):
        return self.address < other.address
从functools导入总排序
@总订单
类url(对象):
定义初始化(自我,地址):
self.address=地址
定义(自我):
返回自我地址
定义(自身、其他):
返回self.address==其他.address
定义(自身、其他):
返回self.address

这使得所有比较都可以使用名为“address”的字符串属性。但是,如果比较其他对象,则此操作将失败

\uuuu cmp\uuuu
已过时,并且在中确实有效。在3.2+
functools.total_ordering
中,是一种免费获取所有比较的简单方法。在以前的版本中,每个版本仍然只有一行代码(如果您只想要平等和不平等,则只有一行代码)。@delnan True。通过添加该替代方案进行编辑。我更多地考虑了如何在类中实现它,这是本解决方案的后一部分所做的。使用
\uuuu eq\uuu
使我的代码正常工作。
from functools import total_ordering

@total_ordering
class url(object):
    def __init__(self, address):
       self.address = address

    def __str__(self):
        return self.address

    def __eq__(self, other):
        return self.address == other.address

    def __lt__(self, other):
        return self.address < other.address