子类与父类
本文作者:余术玲
文字编辑:孙晓玲
导读
Python是一门面向对象的编程语言,支持类继承。新的类称为子类(Subclass),被继承的类称为父类、基类或者超类。继承就是让类和类之间产生父子关系,子类可以拥有父类的静态属性和方法。子类继承父类后,就拥有父类的所有特性。举个简单的例子说明:
类A有某种属性1,类B也有某种属性1,类C也有某种属性1,定义类A的时候把属性1声明一遍,定义类B的时候又声明一遍,定义类C又声明一遍实在太麻烦了,为了简单化我们就把属性1提取出来作为父类,然后类A,类B,类C都是它的子类,子类继承父类,拥有父类的全部属性,这样就不用每次都定义属性1了。
定义三个类vegetable、Potato和Pepper:
In [1]: class vegetable():
...: def color(self):
...: print("colorful")
...:
...: class Potato(vegetable):
...: pass
...:
...: class Pepper(vegetable):
...: pass
...:
...: potato = Potato()
...: pepper = Pepper()
...: potato.color()
...: pepper.color()
colorful
colorful
子类除了可以继承父类的方法,还可以覆盖父类的方法。
In [2]: class vegetable():
...: def color(self):
...: print("colorful")
...:
...: class Potato(vegetable):
...: def color(self):
...: print("yellow")
...:
...: class Pepper(vegetable):
...: def color(self):
...: print("red")
...:
...: potato = Potato()
...: pepper = Pepper()
...: potato.color()
...: pepper.color()
yellow
red
当定义子类Potato和Pepper时,我们重新定义了color方法,则父类的方法被覆盖。
我们曾经在《类型内置函数-Type() isinstance()》推文中提到用函数isinstance()判断实例对象与类对象的关系,第一个参数是实例对象,第二个参数是自定义的类类型或 Python标准数据类型(int,long,float,list,tuple,dict,str,bool,complex)或由二者构成的元组,这里再继续补充一下具体使用时如果涉及到子类、父类的情况。
isinstance()中当第二个参数是自定义的类类型,对象的类型是参数二的子类会返回True。
In [3]: class Y:
...: pass
...: class W:
...: pass
...: class Z(Y): #定义Y的子类Z
...: pass
...: object=Z() #定义Z的实例对象object
...:
In [4]: isinstance(object,W)
Out[4]: False
In [5]: isinstance(object,Y)
Out[5]: True
实例对象object的类型是Z,与参数二不一致,且Z不是W的子类,所以结果返回 False,但Z是Y的子类,所以第二个函数结果返回True。
当第二个参数是类型元组,对象类型的父类在元组中,也会返回True。
In [6]: isinstance(object,(int,str,Y,W))
Out[6]: True
In [7]: isinstance(object,(int,str,W))
Out[7]: False
实例对象object的类型是Z,Z的父类是Y,第二个参数中包含Y,因此返回 True,而第二个函数中Z与Y均不在(int,str,W)中,因此返回False。
2.type()
type() 函数中子类与父类是两个不同的类型,用type()做判断时,需要明确区分到底是哪个类,如:
In [8]: print(type(object) is Y)
False
In [9]: isinstance(object,Y)
Out[9]: True
简而言之,type()不会认为子类是一种父类类型,不考虑继承关系,是两家人。isinstance()会认为子类是一种父类类型,考虑继承关系,是一家人。关于类的知识,你弄清楚了吗?
关于我们
微信公众号“Stata and Python数据分析”分享实用的stata、python等软件的数据处理知识,欢迎转载、打赏。我们是由李春涛教授领导下的研究生及本科生组成的大数据处理和分析团队。
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。