You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python中创建参数依赖类:参数相等则类对象相等?

实现参数依赖且相等参数生成相等类对象的Python方案

基础场景:简单动态类的缓存实现

你给出的基础示例中,每次调用create_class(3)都会生成全新的Bar类,因此a==b返回False。核心解决思路是缓存相同参数对应的类实例,用functools.lru_cache装饰器即可实现:

from functools import lru_cache

@lru_cache(maxsize=None)
def create_class(n):
    class Bar:
        nn = n
    return Bar

a = create_class(3)
b = create_class(3)
print(a == b)  # 输出True

lru_cache会记录相同参数n对应的Bar类,后续调用直接返回缓存的类对象,自然满足相等性要求。

进阶场景:带嵌套继承的动态类实现

你尝试的Foo类嵌套内部类场景中,每次实例化Foo(n)都会重新定义Bar和Barr类,哪怕n相同,这些内部类仍是不同对象。解决方法是把内部类的生成逻辑抽离为带缓存的独立函数:

from functools import lru_cache

@lru_cache(maxsize=None)
def _create_bar(n):
    class Bar:
        nn = n
        def __init__(self, m):
            print(f"This uses n={Bar.nn} and m={m} in funny ways")
    return Bar

@lru_cache(maxsize=None)
def _create_barr(n):
    Bar = _create_bar(n)
    class Barr(Bar):
        nnn = n + 1
        def asd(self):
            print(f"I have inheritance too {Bar.nn} {Barr.nnn}")
    return Barr

class Foo:
    def __init__(self, n):
        self.n = n
        self.B = _create_bar(n)
        self.BB = _create_barr(n)
    
    def __eq__(self, other):
        return type(self) == type(other) and self.n == other.n

# 测试验证
ap = Foo(3)
a = Foo(3)
print(ap.B == a.B)  # 输出True
print(ap.BB == a.BB)  # 输出True

将内部类生成逻辑放到带缓存的函数后,相同n会返回同一个类对象,同时保留了原有的继承关系和功能。

复杂参数的处理方案

如果参数是复杂对象,只要该对象可哈希(实现__hash__和__eq__方法),lru_cache就能正常工作。若复杂对象默认不可哈希,可自定义哈希逻辑,基于对象的关键属性生成哈希值:

class ComplexParam:
    def __init__(self, x, y):
        self.x = x
        self.y = y
    
    def __eq__(self, other):
        return isinstance(other, ComplexParam) and self.x == other.x and self.y == other.y
    
    def __hash__(self):
        return hash((self.x, self.y))

# 之后即可用ComplexParam实例作为参数传入带缓存的类生成函数

内容的提问来源于stack exchange,提问作者Lewwwer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 17:55:15