V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
xurunfei
V2EX  ›  问与答

Python 3 继承相关问题,大家帮忙看看,谢谢啦

  •  
  •   xurunfei · 2023-04-07 18:36:15 +08:00 · 968 次点击
    这是一个创建于 621 天前的主题,其中的信息可能已经有所发展或是发生改变。

    新手求教 python3 问题

    1. info 和 A info 和 A 在两个文件里

    我希望获去 A 的子类 Info 按照逻辑 A 继承了 ABC ,Info 继承了 A,那 Info 既是 A 的子类也是 ABC 的子类, 但是实际结果却是 Info 是 ABC 的子类却不是 A 的子类,求解

    1. B 和 A 但是相同的方式如果 B 和 A 是在同一个文件里面,B 就既是 A 的子类又是 ABC 的子类

    因为实际业务中我有很多子类需要继承 A,都写在一个文件里面就很臃肿,所以并不希望使用第二种情况

    希望大家帮忙看下是啥问题,或者有什么方式能实现我的逻辑 逻辑为:在 A 中能获取他所有的子类并且能调用子类的方法

    python 我是新手,比较菜,大佬勿喷哈

    main/alfred/file/A.py

    #!/usr/local/bin/python3
    # coding=utf-8
    from abc import ABC, abstractmethod
    import importlib, inspect
    from main.alfred.file import Info
    
    
    class A(ABC):
        result = None
    
    
    class B(A):
        result = None
    
    
    if __name__ == '__main__':
        info_info = Info.Info
        subclass = issubclass(info_info, A)
        subclass2 = issubclass(info_info, ABC)
        print("info extend A %s" % subclass)
        print("info extend ABC %s " % subclass2)
    
        subclass3 = issubclass(B, A)
        subclass4 = issubclass(B, ABC)
    
        print("B extend A %s" % subclass3)
        print("B extend ABC %s " % subclass4)
    
    

    包路径 main/alfred/file/Info.py

    #!/usr/local/bin/python3
    # coding=utf-8
    from main.alfred.file.A import A
    
    class Info(A):
        result = None
    
    

    输出结果

    Connected to pydev debugger (build 203.7148.57)
    info extend A False
    info extend ABC True 
    B extend A True
    B extend ABC True 
    
    12 条回复    2023-04-10 10:11:38 +08:00
    ll5270
        1
    ll5270  
       2023-04-07 18:54:47 +08:00
    你这不会循环引用吗?
    Anarchy
        2
    Anarchy  
       2023-04-07 18:56:22 +08:00 via Android
    我觉得你先说清楚你想要的效果吧,感觉核心问题和继承没关系你需要一些设计模式来解决。
    xurunfei
        3
    xurunfei  
    OP
       2023-04-07 19:06:05 +08:00 via iPhone
    @ll5270 倒是没有给我报这个错,最后有执行结果,貌似循环引用在 python3.6 以后不会报了
    @Anarchy 我补充一下内容,设计模式我去看看
    xurunfei
        4
    xurunfei  
    OP
       2023-04-07 19:09:11 +08:00 via iPhone
    我想要的功能是比较简单,就是 a 是父类 b c d 是子类,我要在 a 中直接通过一个方法获取 b c d 所有类并调用他们的方法
    stein42
        5
    stein42  
       2023-04-07 19:34:20 +08:00   ❤️ 2
    这是循环 import 带来的问题,info_info 的基类就不是 A 。
    print(info_info.__base__ is A)
    print(info_info.__base__)
    print(A)

    python 没报错是 python 的问题。
    ospider
        6
    ospider  
       2023-04-07 19:44:58 +08:00
    现在不流行继承了,你这都是反模式。
    xurunfei
        7
    xurunfei  
    OP
       2023-04-07 20:02:29 +08:00 via iPhone
    @stein42 谢谢我换个方式试试

    @ospider java 过来的😂,所以习惯了 java 的方式了,换个方式试试
    bestcondition
        8
    bestcondition  
       2023-04-07 23:55:05 +08:00 via Android
    @stein42 学到了,一个是模块 A 下的 A ,一个是作为 main 下的 A ,竟然不是同一个 A
    Anarchy
        9
    Anarchy  
       2023-04-08 10:47:52 +08:00
    @xurunfei 所以我理解你想要 A 类方法调用后可以把 B 、C 、D 方法都调用一遍。其实继续用 JAVA 思路设计就是搞个 S 作为接口,ABCD 都实现 S ,然后在 A 的实现里注册 BCD 放在一个列表里,再由 A 处理 BCD 的调用。
    xurunfei
        10
    xurunfei  
    OP
       2023-04-09 10:59:42 +08:00 via iPhone
    @Anarchy 对,是这样,我试试你的方法
    xurunfei
        11
    xurunfei  
    OP
       2023-04-10 10:11:21 +08:00
    @stein42 多谢老哥,是循环依赖导致的,我把最后的调用放到另一个文件里面就可以了
    xurunfei
        12
    xurunfei  
    OP
       2023-04-10 10:11:38 +08:00
    也谢谢其他帮忙的老哥
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2116 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 16:13 · PVG 00:13 · LAX 08:13 · JFK 11:13
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.