在python中,条件继承忽略工作区中已更改的条件
我有两个结构相似但功能不同的类。我希望第三个类能够根据我的需要从其中任何一个继承。假设我有一个对象模块,我在模块中定义了类A、B和C。以下是我在internet上找到的语法后执行条件继承的方法:在python中,条件继承忽略工作区中已更改的条件,python,oop,multiple-inheritance,Python,Oop,Multiple Inheritance,我有两个结构相似但功能不同的类。我希望第三个类能够根据我的需要从其中任何一个继承。假设我有一个对象模块,我在模块中定义了类A、B和C。以下是我在internet上找到的语法后执行条件继承的方法: cond = True class C(A if cond else B): def __init__(self): super.__init__() 其中A和B是模块对象中的其他类。现在,当我将对象和类C从对象模块导入jupyter笔记本并更改条件时: objects.c
cond = True
class C(A if cond else B):
def __init__(self):
super.__init__()
其中A和B是模块对象中的其他类。现在,当我将对象和类C从对象模块导入jupyter笔记本并更改条件时:
objects.cond = False
my_class = C()
当我检查父类的名称时,似乎没有发生任何影响。这意味着在更改条件后,我希望类C从B继承,但它从类A继承,就好像cond
仍然计算为True
。我尝试过不从模块导入类,只导入objects模块,并用my_class=objects.C()
实例化我的类,但仍然不会发出新的条件
现在,在我的例子中,只要在需要时手动更改模块内部的条件并不困难,但我想知道这一切对python的语法有什么影响。我是做错了什么,还是因为python中模块级和类级之间存在某种命令优先级?或者语法可能是错误的
注意:我还没有写一个完整的C类,其他的东西都是在C类中完成的,其中一些会根据继承的父类而改变。该代码将用作一个虚拟示例,但我认为这是一个充分的示例。解释
Python导入的工作原理如下:
- 它执行模块中的代码
- 通过执行模块代码创建的符号放置在模块符号表中(包括C类)
- 导入仅为进程加载一次模块(即模块为缓存)。因此,同一模块的后续导入没有效果
- 因此,C类的定义在第一次导入时放在模块符号表中。因此,在导入后更改cond对定义没有影响
- 使用“重新加载”强制重新加载模块(即不使用缓存版本)
跨模块共享全局变量
cond = True
- 建议的方法是将全局共享变量放置在配置模块中
考虑到上述情况,以下代码有效
代码
config.py(包含要跨模块共享的全局变量)
test_abc.py(包含类别a、b、c的定义)
main.py(主程序)
输出
First call: A 1
Second call: B 1
您是否尝试过在导入模块中仅使用类A和B,并在本地设置cond和定义C?我认为这是您的条件继承所必需的,因为代码是在导入时执行的,即“像class和def这样的关键字不是声明。相反,它们是实际执行的实时语句”。好的,这很有意义,我只是想知道python中更深层次的情况。我认为提供一个全面解释您刚才评论内容的答案是无害的。@P.basimfar--发布了一个答案。让我知道这是否有助于澄清。
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