你绝对没想到的 python 小技巧:定义一个类但出现三个类
前言 跟同事聊天时同事有的一个很怪的需求:衍生类,也就是说定义一个类,但希望还能同时出现两个与它强相关的衍生类。不多说了,看代码吧: def test(cls): class A(cls): @staticmethod def test(): print('A', cls.__name__) class B(cls): @staticmethod def test(): print('B', cls.__name__) globals()[cls.__name__ + 'A'] = A globals()[cls.__name__ + 'B'] = B return cls @test class T(object): ... TA.test() TB.test() 原理很简单,装饰器test输入一个类,同时基于该类在全局注册两个类,然后返回原类,实际使用时就会发现我们定义了一个类却一下子得到了三个类。用这种方法可以做很坏的事情: 比方说我们在全局注册类的时候,让新类的命名与旧类完全无关,同时不返回原类,用户看到我们调用某个类却找不到该类在哪里定义的,通常的 IDE 对于这种做法完全无能为力。 更进一步,如果新类的类名是通过某种运算得到的,那么用户就算用搜索也找不到这个类定义的位置。 还有更坏的做法,可以挂羊头卖狗肉。比如实现了A类和B类,但是通过装饰器让A和B功能互换,接口却保持一致,一般人阅读代码时绝对想不到它们发生了这种变化。 最后,如果你想做这种坏事,要记得保护你的这个装饰器,把它混淆起来让人没办法阅读就对了。