Python 3 继承相关问题,大家帮忙看看,谢谢啦 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
xurunfei
V2EX    问与答

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

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

新手求教 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 的问题。
4BVL25L90W260T9U
    6
4BVL25L90W260T9U  
   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     Solana     2574 人在线   最高记录 6679       Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 93ms UTC 00:18 PVG 08:18 LAX 16:18 JFK 19:18
Do have faith in what you're doing.
ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86