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

2023-04-07 18:36:15 +08:00
 xurunfei

新手求教 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 
818 次点击
所在节点    问与答
12 条回复
ll5270
2023-04-07 18:54:47 +08:00
你这不会循环引用吗?
Anarchy
2023-04-07 18:56:22 +08:00
我觉得你先说清楚你想要的效果吧,感觉核心问题和继承没关系你需要一些设计模式来解决。
xurunfei
2023-04-07 19:06:05 +08:00
@ll5270 倒是没有给我报这个错,最后有执行结果,貌似循环引用在 python3.6 以后不会报了
@Anarchy 我补充一下内容,设计模式我去看看
xurunfei
2023-04-07 19:09:11 +08:00
我想要的功能是比较简单,就是 a 是父类 b c d 是子类,我要在 a 中直接通过一个方法获取 b c d 所有类并调用他们的方法
stein42
2023-04-07 19:34:20 +08:00
这是循环 import 带来的问题,info_info 的基类就不是 A 。
print(info_info.__base__ is A)
print(info_info.__base__)
print(A)

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

@ospider java 过来的😂,所以习惯了 java 的方式了,换个方式试试
bestcondition
2023-04-07 23:55:05 +08:00
@stein42 学到了,一个是模块 A 下的 A ,一个是作为 main 下的 A ,竟然不是同一个 A
Anarchy
2023-04-08 10:47:52 +08:00
@xurunfei 所以我理解你想要 A 类方法调用后可以把 B 、C 、D 方法都调用一遍。其实继续用 JAVA 思路设计就是搞个 S 作为接口,ABCD 都实现 S ,然后在 A 的实现里注册 BCD 放在一个列表里,再由 A 处理 BCD 的调用。
xurunfei
2023-04-09 10:59:42 +08:00
@Anarchy 对,是这样,我试试你的方法
xurunfei
2023-04-10 10:11:21 +08:00
@stein42 多谢老哥,是循环依赖导致的,我把最后的调用放到另一个文件里面就可以了
xurunfei
2023-04-10 10:11:38 +08:00
也谢谢其他帮忙的老哥

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/930652

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX