查看原文
其他

子类与父类

爬虫俱乐部 Stata and Python数据分析 2022-03-15

本文作者:余术玲

文字编辑:孙晓玲

技术总编:张   邯

导读

Python是一门面向对象的编程语言,支持类继承。新的类称为子类(Subclass),被继承的类称为父类、基类或者超类。继承就是让类和类之间产生父子关系,子类可以拥有父类的静态属性和方法。子类继承父类后,就拥有父类的所有特性。举个简单的例子说明:

类A有某种属性1,类B也有某种属性1,类C也有某种属性1,定义类A的时候把属性1声明一遍,定义类B的时候又声明一遍,定义类C又声明一遍实在太麻烦了,为了简单化我们就把属性1提取出来作为父类,然后类A,类B,类C都是它的子类,子类继承父类,拥有父类的全部属性,这样就不用每次都定义属性1了。

一、类继承
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()colorfulcolorful
这里vegetable为父类,Potato和Pepper为子类,子类继承了父类的特性,所以即使在定义时没有声明,Potato和Pepper也拥有color()方法。
2.特殊继承

子类除了可以继承父类的方法,还可以覆盖父类的方法。

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()yellowred

当定义子类Potato和Pepper时,我们重新定义了color方法,则父类的方法被覆盖。

二、内置函数中的子类与父类

我们曾经在《类型内置函数-Type() isinstance()》推文中提到用函数isinstance()判断实例对象类对象的关系,第一个参数是实例对象,第二个参数是自定义的类类型或 Python标准数据类型(int,long,float,list,tuple,dict,str,bool,complex)或由二者构成的元组,这里再继续补充一下具体使用时如果涉及到子类、父类的情况。

1.isinstance()

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]: FalseIn [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)FalseIn [9]: isinstance(object,Y)Out[9]: True

简而言之,type()不会认为子类是一种父类类型,不考虑继承关系,是两家人isinstance()会认为子类是一种父类类型,考虑继承关系,是一家人。关于类的知识,你弄清楚了吗?







对我们的推文累计打赏超过1000元,我们即可给您开具发票,发票类别为“咨询费”。用心做事,不负您的支持!
往期推文推荐
用requests库爬取淘宝数据
WordStat—Stata的文本分析小助手
数据筛选理还乱,datacheck能诊断

如何用简单的手法绘制出不一样的海外疫情趋势图

matplotlib绘制数学函数
gen的再进化
Stata版大家来找茬—cfout就够了
另辟蹊径js逆向爬取百度翻译
可迭代对象、迭代器、生成器傻傻分不清楚
Ftools命令组之fegen命令介绍
提升效率的利器——如何用labvarch批量修改变量标签
二进制序列类型——bytes()、bytearray()
今日头条海外疫情数据爬取
anythingtodate带你轻松处理日期
_variables介绍
查询12306车次信息
海外疫情仍严峻,劝君更在家中留

关于我们



微信公众号“Stata and Python数据分析”分享实用的stata、python等软件的数据处理知识,欢迎转载、打赏。我们是由李春涛教授领导下的研究生及本科生组成的大数据处理和分析团队。

此外,欢迎大家踊跃投稿,介绍一些关于stata和python的数据处理和分析技巧。
投稿邮箱:statatraining@163.com
投稿要求:
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存