super() +父类中的方法,可直接子类调用运行父类的(方法)函数
最近在编程中遇到某些数据需要通过类方法(或者说是函数)去读取,并且保存在类的属性当中(即实例化过程),以保证数据在整个类方法中共享。但由于该属性是根据类方法实例化获取的,导致在类方法之间的相互引用当中出现较大的困难,因为类方法实例过程中往往需要传入举例的实参。解决方案如下:(是在b站上看到的方法,偶然试一试)
下段代码为父类属性的获取方式:
temp_list=[[2, 1, 0, 3, 1, 6, 3, 7, 5, 3, 4, 6], [1, 8, 2, 5, 4, 10, 5, 10, 0, 10, 3, 4],[2, 5, 3, 4, 5, 8, 0, 9, 1, 1, 4, 7], [1, 5, 0, 5, 2, 5, 3, 3, 4, 8, 5, 9], [2, 9, 1, 3, 4, 5, 5, 4, 0, 3, 3, 1],[1, 3, 3, 3, 5, 9, 0, 10, 4, 4, 2, 1]]
class Data():
"""读取列表,获取机器工时工序等加工信息"""
def __inint(self, temp_list='', process='', machine=6, job=6, time='',):
self.temp_list = temp_list
self.process = process
self.machine = machine
self.job = job
self.time = time
def time_listget(self):
"""获取各工序的加工时间,但其每次为随机取值,故参考意义不大"""
self.temp_list = vt.getexcel('filename.xls')#实际的temp_listsh从别的代码文件引出,
self.time = vt.valueto_interval(self.temp_list)
def machine_job_num(self):
"""获取工件及机器的数量,"""
self.job = len(self.temp_list)
self.machine = int(len(self.temp_list[1]) / 2)
def peocess_get(self):
"""获取工件的加工工艺顺序,即工序"""
self.process = []
for i in range(len(self.temp_list)):
tem_process = []
for j in range(0, len(self.temp_list[0]), 2):
tem_process.append(self.temp_list[i][j])
self.process.append(tem_process)
return self.process
def main(self): #该方法代码为自身调用类方法,改写类属性,同时也可利用在子类中调整父代属性
self.time_listget()
self.peocess_get()
self.machine_job_num()
上行代码中的main方法将能够轻松的改变子代无法继承父类属性的难题,但实际上只是继承其形参和方法。利用super方法调用父类中的方法,直接改变子类中的属性。
class IAto_Sto(Data):
def __init__(self, temp_list='', process='', machine=6, job=6, time='',):
"""获取加工信息"""
super().main()
super().__init__()#本段继承方法完全没有必要,还有书上或者csdn上的各种调用方式,个人觉得无法解决类属性的动态性问题
#举例说明
a = IAto_Sto()
print(a.process)
#运行结果如下
[[2, 0, 1, 3, 5, 4], [1, 2, 4, 5, 0, 3], [2, 3, 5, 0, 1, 4], [1, 0, 2, 3, 4, 5], [2, 1, 4, 5, 0, 3], [1, 3, 5, 0, 4, 2]]
上述的代码倘若写成方式调用:super().__init__(temp_list='', process='', machine=6, job=6, time=''),则报错:TypeError: object.__init__() takes no arguments;
或者super().__init__(),则报错:AttributeError: 'IAto_Sto' object has no attribute 'process'
报错原因,怀疑因为没有给定具体实参。当通过super().main()函数调用后,参数变成了具体参数。在子类中就可以继承实例化属性了。