注: 可以直接翻到最下面,有相关的解决代码
问题描述
在项目中,需要运行检查,某个类是否是子类的时候,出现了明明是子类,但是通过issubclass验证却一直是false的情况
代码还原
基准类(父类)
class Month:
site_name = None
def __init__(self):
pass
def run(self):
"""
所有子类必须重写run方法
"""
raise NotImplementedError
测试类(继承Month的一个子类)
from WebSite.Month import Month
class Son(Month):
site_name = "测试子类"
def __init__(self):
pass
def run(self):
"""
必须重写该方法,否则异常
"""
print("我是子类")
验证代码
from Sons.CS import Son
from Month import Month
print(issubclass(Son, Month))
# output: false
一些失败尝试
1. 在子类py文件中进行判断
from WebSite.Month import Month
class Son(Month):
site_name = "测试子类"
def __init__(self):
pass
def run(self):
"""
必须重写该方法,否则异常
"""
print("我是子类")
if __name__ == '__main__':
print(issubclass(Son, Month))
# output: True
2. 在子类中添加super()
from WebSite.Month import Month
class Son(Month):
site_name = "测试子类"
def __init__(self):
super().__init__()
def run(self):
"""
必须重写该方法,否则异常
"""
print("我是子类")
再次验证
from Sons.CS import Son
from Month import Month
print(issubclass(Son, Month))
# output: false
问题总结
1. 确认继承是没有问题的
2. 没有同名的类,也没有对类进行过动态修改
3. 在子类文件中没有问题、在其他文件中就存在这个问题
实际解决
运行子类的__bases__检查父类来源
from Sons.CS import Son
from Month import Month
print(Son.__bases__)
print(Month.__module__)
# output1: (<class 'WebSite.Month.Month'>,)
# output2: Month
大概猜测
可以看到父类的module中只有一个Month包,相对于子类的__bases__缺少了一个WebSite
验证(最终解决)
from Sons.CS import Son
from WebSite.Month import Month
print(Son.__bases__)
print(Month.__module__)
print(issubclass(Son, Month))
# output1: (<class 'WebSite.Month.Month'>,)
# output2: WebSite.Month
# output3: True