Python中的继承和override(由类的实例获取类的字符串信息)

来源:互联网 发布:postgresql 数组查询 编辑:程序博客网 时间:2024/05/16 05:25

        今天花了些时间将Python中的继承知识,敲了些代码来加深理解。下面是整个程序

<span style="font-size:18px;">class Animal(object):"""Inherit and override function."""def __init__(self,name , weight, height):self.name = nameself.weight = weightself.height = heightdef __str__(self):return '%s height : %g , weight : %g' %(self.name, self.weight, self.height)def eat(self):print 'Animal eat function.'def sleep(self):print 'Animal sleep function.'class dog(Animal):"""subclass dog."""def __init__(self, name, weight, height, legs):Animal.__init__(self, name, weight, height)self.legs = legsdef __str__(self):#return '%s has height : %g , weight : %g and legs :%g.' %(self.name, self.height, self.weight, self.legs)return Animal.__str__(self)+ ",legs: %g." % self.legsdef lovedfood(self):return 'I love eatting noodles.'def fdc(obj, meth_name):"""find_defining_class."""for ty in type(obj).mro():if meth_name in ty.__dict__:return (obj.__class__.__name__)+'.'+ meth_name + '() ---> class '+ty.__name__+'.\n'def main():dg = dog("button", 5, 0.5,4)print dgprint dg.lovedfood()print fdc(dg, 'eat')print fdc(dg, 'lovedfood')if __name__ == '__main__':main()</span>
这其中主要是父类Animal和子类dog。父类的结构如图,包含一个初始化函数,一个打印对象内容的__str__以及eat()和sleep()函数,变量主要有三个:name,weight和height。

子类的结构如下图所示:

它重写了父类的初始化函数和打印函数,增加了一个成员变量legs,同时还额外加入了一个lovedfood( )方法。

外部函数有测试用到的main( )和检查调用函数的fdc( )它的作用是检测调用的函数到底是属于子类的还是父类的。

<span style="font-size:14px;">def fdc(obj, meth_name):"""find_defining_class."""for ty in type(obj).mro():if meth_name in ty.__dict__:return (obj.__class__.__name__)+'.'+ meth_name + '() ---> class '+ty.__name__+'.\n'</span>

最后的main( )函数以及它的调试输出是:

def main():dg = dog("button", 5, 0.5,4)print dgprint dg.lovedfood()print fdc(dg, 'eat')print fdc(dg, 'lovedfood')


 它的打印格式今天调了很久,最主要的是卡在了,打印obj上。因为obj是对象,我想把它转化为字符串。
  • 一开始想的是str(obj),没有打印出来。

  • 使用内置函数repr(),其缩写是return a printable representation,返回一个可打印的形式。

  • 还有就是外部模块pickle.dumps( )和pickle.loads( )函数,有些复杂。

最后我想dg既然是dog的一个实例化对象,而dog又是从Animal继承而来,应该会有记录相关的类的信息。因此,我就利用dir( )查看了关于它的信息

最后确认了dg.__class__.__name__就是我们所需要的信息。至此,就可以打印出正确的信息了。大笑微笑

0 0