【问题标题】:Change the list of classes a class inherits from更改类继承自的类列表
【发布时间】:2019-09-04 01:31:21
【问题描述】:

我完全知道这不是您通常想要做的事情。

我正在使用一个库(不幸的是)有很多类型检查。但是,我有一个可行的解决方案,只有当库中的其中一个类型检查被注释掉时。我想要一个不需要修改库代码的解决方案。

更具体地说,我需要绕过这段代码:

def is_valid(arg):
    return inspect.isclass(arg) and issubclass(arg, SomeClass)

我的arg 不可能是SomeClass 的子类,因为SomeClass 的元类中发生了一些事情,这对我的情况来说是不希望发生的。

所以唯一的选择就是破解。我能否让 Python 认为 arg 继承自 SomeClass 而实际上并没有?

【问题讨论】:

    标签: python class subclass


    【解决方案1】:

    我想你可以这样做......

    import inspect
    
    def is_valid(arg):
        return inspect.isclass(arg) and issubclass(arg, Base)
    
    class OtherType(type):
        pass
    
    class Base(metaclass=OtherType):
        pass
    
    class SurpriseBase:
        pass
    
    class SurpriseDerived(SurpriseBase):
        pass
    
    print(f'SurpriseDerived is_valid: {is_valid(SurpriseDerived)}')
    
    SurpriseDerived.__bases__ = (Base,)
    
    print(f'Base metaclass: {type(Base)}')
    print(f'SurpriseDerived metaclass: {type(SurpriseDerived)}')
    print(f'SurpriseDerived is_valid: {is_valid(SurpriseDerived)}')
    

    输出:

    SurpriseDerived is_valid: False
    Base metaclass: <class '__main__.OtherType'>
    SurpriseDerived metaclass: <class 'type'>
    SurpriseDerived is_valid: True
    

    【讨论】:

    • 真的那么简单吗?在询问之前我没有尝试过这个,我几乎感到羞耻。谢谢!
    • 公平警告:这个解决方案回答了被问到的问题,但这样做可能会产生副作用(我从来没有理由这样做)。如果有,请分享!
    • 感谢您的警告,如果我遇到问题,我会在这里告诉大家。但到目前为止,对我来说,一切似乎都按预期进行。
    猜你喜欢
    • 2021-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-03
    • 1970-01-01
    相关资源
    最近更新 更多