Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python中,条件继承忽略工作区中已更改的条件_Python_Oop_Multiple Inheritance - Fatal编程技术网

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

在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

我有两个结构相似但功能不同的类。我希望第三个类能够根据我的需要从其中任何一个继承。假设我有一个对象模块,我在模块中定义了类A、B和C。以下是我在internet上找到的语法后执行条件继承的方法:

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