MST

星途 面试题库

面试题:Python元类与变量相等性检查的深度定制

定义一个元类,使得所有基于该元类创建的类,其实例在使用'=='检查相等性时,不仅比较实例的属性值,还会考虑实例的创建时间(假设可以获取创建时间)。同时,在使用'is'检查相等性时,除了内存地址相同外,还需满足一个自定义的复杂条件(例如实例的某个特定方法的执行结果符合特定规则)。请给出完整的代码实现,并解释关键步骤。
17.0万 热度难度
编程语言Python

知识考点

AI 面试

面试题答案

一键面试
import time


class CustomMeta(type):
    def __call__(cls, *args, **kwargs):
        instance = super().__call__(*args, **kwargs)
        instance._creation_time = time.time()
        return instance


class BaseClass(metaclass=CustomMeta):
    def __eq__(self, other):
        if not isinstance(other, self.__class__):
            return False
        return self.__dict__ == other.__dict__ and self._creation_time == other._creation_time

    def custom_method(self):
        # 这里假设具体实现
        return True


def custom_is_condition(self, other):
    return self.custom_method() == other.custom_method()


BaseClass.__is__ = custom_is_condition


class SubClass(BaseClass):
    def __init__(self, value):
        self.value = value


# 测试代码
obj1 = SubClass(10)
obj2 = SubClass(10)
time.sleep(1)
obj3 = SubClass(10)

print(obj1 == obj2)  # False,因为创建时间不同
print(obj1 == obj3)  # False,因为创建时间不同

# 这里模拟is检查,实际上is是基于内存地址,这里只是自定义类似行为
def custom_is(obj1, obj2):
    return id(obj1) == id(obj2) and obj1.__is__(obj2)


print(custom_is(obj1, obj1))  # True

关键步骤解释:

  1. 元类定义
    • 定义CustomMeta元类,在__call__方法中为每个实例添加_creation_time属性,记录实例的创建时间。
  2. 基类定义
    • BaseClass使用CustomMeta作为元类。
    • 重写__eq__方法,不仅比较实例的属性字典__dict__,还比较_creation_time属性,以满足相等性检查中对创建时间的要求。
    • 定义custom_method作为自定义方法,用于在自定义的is检查中。
    • BaseClass添加自定义的__is__方法,用于实现自定义的复杂条件检查。
  3. 子类定义
    • SubClass继承自BaseClass,并在__init__方法中添加了一个属性value
  4. 测试部分
    • 创建了三个SubClass实例obj1obj2obj3,通过==比较实例,展示出除属性值外创建时间也会影响相等性判断。
    • 定义custom_is函数模拟is检查,除了检查内存地址相同外,还调用__is__方法检查自定义条件。