系列最后一篇来说说Python中的类与对象,Python这门语言是无处不对象,如果你曾浅要了解过Python,你应该听过Python是一种面向对象编程的语言,所以你经常可能会看到面向“对象”编程这类段子,而面向对象编程的语言都会有三大特征:封装、继承、多态。
我们平时接触到的很多函数、方法的操作都具有这些性质,我们只是会用,但还没有去深入了解它的本质,下面就介绍一下关于类和对象的相关知识。
封装
封装这个概念应该并不陌生,比如我们把一些数据封装成一个列表,这就属于数据封装,我们也可以将一些代码语句封装成一个函数方便调用,这就是代码的封装,我们也可以将数据和代码封装在一起。用术语表示的话,就是可以将属性和方法进行封装,从而得到对象。
首先我们可以定义一个类,这个类中有属性和方法,但有的伙伴会比较好奇,属性和方法不是会封装成对象嘛,为什么又变成类了?举个例子,类就好比是一个毛坯房,而对象是在毛坯房的基础上改造成的精装房。
class XiaoMing: #属性 height = 180 weight = 65 sex = '男' #方法 def run(self): print('小明在跑步') def sleep(self): print('小明在睡觉')
在类定义完成时就创建了一个类对象,它是对类定义创建的命名空间进行了一个包装。类对象支持两种操作:属性引用和实例化。
属性引用的语法就是一般的标准语法:obj.name。比如XiaoMing.height和XiaoMing.run就是属性引用,前者会返回一条数据,而后者会返回一个方法对象。
In[1]:print(XiaoMing.height) Out[1]:180 In[2]:print(XiaoMing.run) Out[2]:<function XiaoMing.run at 0x0000021C6239D0D0>
这里也支持对类属性进行赋值操作,比如为类中的weight属性赋予一个新值。
In[3]:print(XiaoMing.weight) Out[3]:65 In[4]:XiaoMing.weight = 100 In[5]:print(XiaoMing.weight) Out[5]:100
而类的实例化可以将类对象看作成一个无参函数的赋值给一个局部变量,如下:
In[6]:ming = XiaoMing()
ming就是由类对象实例化后创建的一个实例对象,通过实例对象也可以调用类中的属性和方法。
In[7]:ming.run() Out[7]:小明在跑步 In[8]:print(xiaoming.height) Out[8]:180 #通过向类对象调用方法返回的方法对象中传入实例对象也可以达到同样效果 In[11]:XiaoMing.run(ming) Out[11]:小明在跑步
魔法方法__init__
类在实例化过程中并不都是像上面例子一样简单的,一般类都会倾向将实例对象创建为有初始状态的,所以在类中可能会定义一个__init__的魔法方法,这个方法就可以帮助接收、传入参数。
而一个类如果定义了__init__方法,那么在类对象实例化的过程中就会自动为新创建的实例化对象调用__init__方法,请看下面这个例子。
class Coordinates: def __init__(self,x,y): self.x = x self.y = y def print_coor(self): print('当前坐标为(%s,%s)'%(self.x,self.y))
可以看到在__init__()中传入了参数x和y,然后在print_coor中需要接收参数x和y,接下来通过实例化这个类对象,验证一下参数是否能通过__init__()传递到类的实例化操作中。
In[9]:coor = Coordinates(5,3) In[10]:coor.print_coor() Out[10]:当前坐标为(5,3)
继承
所谓继承就是一个新类在另一个类的基础上构建而成,这个新类被称作子类或者派生类,而另一个类被称作父类、基类或者超类,而子类会继承父类中已有的一些属性和方法。
class Mylist(list): pass list_ = Mylist() list_.append(1) print(list_) ''' [1] '''
比如上面这个例子,我并没有将list_定义成一个列表,但它却能调用append方法。原因是类Mylist继承于list这个基类,而list_又是Mylist的一个实例化对象,所以list_也会拥有父类list拥有的方法。
当然可以通过自定义类的形式实现两个类之间的继承关系,我们定义Parent和Child两个类,Child中没有任何属性和方法,只是继承于父类Parent。
class Parent: def par(self): print('父类方法') class Child(Parent): pass child = Child() child.par() ''' 父类方法 '''
覆盖
当子类中定义了与父类中同名的方法或者属性,则会自动覆盖父类对应的方法或属性,还是用上面这个例子实现一下,方便理解。
class Parent: def par(self): print('父类方法') class Child(Parent): def par(self): print('子类方法') child = Child() child.par() ''' 子类方法 '''
可以看到子类Child中多了一个和父类Parent同名的方法,再实例化子类并调用这个方法时,最后调用的是子类中的方法。
Python中继承也允许多重继承,也就是说一个子类可以继承多个父类中的属性和方法,但是这类操作会导致代码混乱,所以大多数情况下不推荐使用,这里就不过多介绍了。
多态
多态比较简单,比如定义两个类,这两个类没有任何关系,只是两个类中有同名的方法,而当两个类的实例对象分别调用这个方法时,不同类的实例对象调用的方法也是不同的。
class XiaoMing: def introduce(self): print("我是小明") class XiaoHong: def introduce(self): print("我是小红")
上面这两个类中都有introduce方法,我们可以实例化一下两个类,利用实例对象调用这个方法实现一下多态。
In[12]:ming = XiaoMing() In[13]:hong = XiaoHong() In[14]:ming.introduce() Out[14]:我是小明 In[15]:hong.introduce() Out[15]:我是小红
常用BIF
1、issubclass(class,classinfo)
判断一个类是否是另一个类的子类,如果是则返回True,反之则返回False。
class Parent: pass class Child(Parent): pass print(issubclass(Child,Parent)) ''' True '''
需要注意的有两点:
- 1.第二个参数不仅可以传入类,也可以传入由类组成的元组。
- 2.一个类被判定为自身的子类,也就是说这两个参数传入同一个类时,也会返回True。
print(issubclass(Parent,Parent)) ''' True '''
2、isinstance(object,classinfo)
判断一个对象是否为一个类的实例对象,如果是则返回True,反之则返回False。
class Parent: pass class Child: pass p = Parent() c = Child() print(isinstance(p,Parent,Child)) #True print(isinstance(c,Parent)) #False
需要注意的有两点:
- 1.第二个参数不仅可以传入类,也可以传入由类组成的元组。
- 2.如果第一个参数传入的不是一个对象,则总是返回False。
3、hasattr(object,name)
判断一个实例对象中是否包含一个属性,如果是则返回True,反之则返回False。
class Parent: height = 100 p = Parent() print(hasattr(p,'height')) ''' True '''
需要注意的是第二个参数name必须为字符串形式传入,如果不是则会返回False。
以上就是简述 Python 的类和对象的详细内容,更多关于Python 的类和对象的资料请关注其它相关文章!
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新日志
- 【雨果唱片】中国管弦乐《鹿回头》WAV
- APM亚流新世代《一起冒险》[FLAC/分轨][106.77MB]
- 崔健《飞狗》律冻文化[WAV+CUE][1.1G]
- 罗志祥《舞状元 (Explicit)》[320K/MP3][66.77MB]
- 尤雅.1997-幽雅精粹2CD【南方】【WAV+CUE】
- 张惠妹.2007-STAR(引进版)【EMI百代】【WAV+CUE】
- 群星.2008-LOVE情歌集VOL.8【正东】【WAV+CUE】
- 罗志祥《舞状元 (Explicit)》[FLAC/分轨][360.76MB]
- Tank《我不伟大,至少我能改变我。》[320K/MP3][160.41MB]
- Tank《我不伟大,至少我能改变我。》[FLAC/分轨][236.89MB]
- CD圣经推荐-夏韶声《谙2》SACD-ISO
- 钟镇涛-《百分百钟镇涛》首批限量版SACD-ISO
- 群星《继续微笑致敬许冠杰》[低速原抓WAV+CUE]
- 潘秀琼.2003-国语难忘金曲珍藏集【皇星全音】【WAV+CUE】
- 林东松.1997-2039玫瑰事件【宝丽金】【WAV+CUE】