【问题标题】:Compare object of different class [duplicate]比较不同类的对象[重复]
【发布时间】:2022-10-19 02:45:42
【问题描述】:

我对 python 和 oop 还是很陌生,我有解决我的问题的方法,但它不是很高效,我想我错过了一些东西。

我的代码:

class User1:
    
    def __init__(self, foo):
        self.foo = foo

class User2:
    
    def __init__(self, foo):
        self.foo = foo

list_of_user1 = getUser1()
list_of_user2 = getUser2()

def do_something_to_user1():

    do_something_to_user = []  

    for user in list_of_user1:
        if user.foo not in [user.foo for user in list_of_user2]:
            do_something_to_user.append(user)
    for user in do_something_to_user:
        something(user)

def do_something_to_user2():

    do_something_to_user = []  

    for user in list_of_user2:
        if user.foo not in [user.foo for user in list_of_user1]:
            do_something_to_user.append(user)
    for user in do_something_to_user:
        something_else(user)

我的问题是,我应该如何比较这些类的多个实例的不同类的两个对象。 有一个更好的方法吗 ?

【问题讨论】:

  • 在 OOP 中,您通常定义一个 User 类,您可以多次实例化该类,从而为您提供类 User 的多个实例。在 Python 中,您可以编写类方法 __eq__(self, other) 来比较实例。
  • 您似乎正在寻找类似集合的功能,因为您希望所有 user1 不在 user2 列表中并且反之亦然.这可以通过实现__hash____eq__ 来实现,这可以像分别返回hash(self.foo)self.foo == other.foo 一样简单。有了那个地方,你就可以做例如set(list_of_user1) - set(list_of_user2)

标签: python python-3.x oop


【解决方案1】:

在评论之后,通常的 OOP 做事方式是创建一个您多次实例化的单个类 User

class User:
    def __init__(self, name: str, age: int):
        self.name = name
        self.age = age

user1 = User("Bob", 20)
user2 = User("Alice", 21)

要比较这两个实例,您可以实现__eq__ 方法。

class User:
    def __init__(self, name: str, age: int):
        self.name = name
        self.age = age

    def __eq__(self, other):
        return self.name == other.name and self.age == other.age


user1 = User("Bob", 20)
user2 = User("Alice", 21)
user3 = User("Bob", 20)

print(user1 == user2) # False
print(user1 == user3) # True

在 OOP 中的某些情况下,您可能有不同类型的用户。当这种情况发生时,这通常是使用继承的地方;

class User:
    def __init__(self, name: str, age: int):
        self.name = name
        self.age = age

    def __eq__(self, other):
        return self.name == other.name and self.age == other.age


class Student(User):
    def __init__(self, name: str, age: int, student_id: int):
        super().__init__(name, age)
        self.student_id = student_id

    def __eq__(self, other):
        return super().__eq__(other) and self.student_id == other.student_id


class Teacher(User):
    def __init__(self, name: str, age: int, teacher_id: int):
        super().__init__(name, age)
        self.teacher_id = teacher_id

    def __eq__(self, other):
        return super().__eq__(other) and self.teacher_id == other.teacher_id

我建议进一步研究super(),但简而言之,它调用了父类方法。希望这可以帮助您更好地理解 OOP 强制执行的关系结构。

【讨论】:

    猜你喜欢
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    • 2017-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多