条件继承忽略了python中工作区中已更改的条件



我有两个类,它们的结构相似,但功能不同。我希望第三个类能够根据我的需要从他们中的任何一个继承。假设我有一个对象模块,并且在该模块中定义了类A、B和C。这就是我在互联网上找到的语法后进行条件继承的方式

cond = True
class C(A if cond else B):
def __init__(self):
super.__init__()

其中A和B是模块对象中的其他类。现在,当我将对象和类C从对象模块导入jupyter笔记本并更改cond:时

objects.cond = False
my_class = C()

当我检查父类的名称时,似乎没有任何效果。这意味着在更改条件后,我希望类C从B继承,但它从类A继承,就好像cond的计算结果仍然是True一样。我尝试过不从模块中导入类,只导入对象模块并用my_class = objects.C()实例化我的类,但仍然不会发出新条件。

现在,在我的情况下,只要需要,就可以在模块内手动更改条件,这并不困难,但我想知道所有这些都说明了python的语法。我是做错了什么,还是因为python中模块和类级别之间的某种命令优先级?或者语法可能是错误的?

注意:我还没有写一个完整的C类,其他的东西正在C类中完成,其中一些会根据继承的父类而改变。该代码是作为一个伪代码,但IMO是一个充分的例子。

解释

Python导入的工作原理如下:

  • 它执行模块中的代码
  • 通过执行模块代码创建的符号被放置在模块符号表中(包括C类(
  • import只为进程加载一次模块(即模块是缓存(。因此,同一模块的后续导入没有任何影响
  • 因此,类C的定义被放置在第一次导入时的模块符号表中。因此,在导入后更改cond对定义没有影响
  • 使用reload强制重新加载模块(即不使用缓存版本(

在模块之间共享全局变量

  • 建议的方法是将全局共享变量放在配置模块中

考虑到以上情况,以下代码可以工作。

代码

config.py(包含要在模块间共享的全局(

cond = True

test_abc.py(包含类a、b、c的定义(

import config
class A(): 
def __init__(self, x): 
self.x = x

def getX(self): 
return f"A {self.x}"

class B(): 
def __init__(self, x): 
self.x = x

def getX(self): 
return f"B {self.x}"   

# inherits from A or B
class C(A if config.cond else B):
def __init__(self, x):
super().__init__(x)

main.py(主程序(

from importlib import reload             # Allows reloading of modules
import config                            # place variables we want to share across modules
# Test with cond = True
config.cond = True                       # Use True in condition for inheritance                         
import test_abc                            # Use import first time, can reload on subsequent calls
ca = test_abc.C(1)
print("First call: ", ca.getX())         # Test that we obtain A object
# Test with cond = False
config.cond = False
reload(test_abc)                          # reload module
ca = test_abc.C(1)
print("Second call:", ca.getX())        # Test that we obtained B object

输出

First call:  A 1
Second call: B 1

相关内容

  • 没有找到相关文章

最新更新