0
点赞
收藏
分享

微信扫一扫

Python进阶:类和对象(三)

ython阶

--类和对象(三)




导语:



     在原来我发布过Python入门学习的学习笔记,但迟迟没有更新Python的进阶学习。今天有时间就更新一下。微信关注公众号:夜寒信息。致力于为每一位用户免费提供更优质技术帮助与资源供给,感谢支持!



★ 一、继承 ★


       这一讲我们来仔细讲解一下继承。首先我们需要了解以下继承的写法。

class <子类名>(<父类名>)


    被继承的类我们把他称作父类,新建的类我们把它叫做子类,子类可以使用父类的所有属性和方法,同时也可以新定义自己的方法和属性。这些我们在第一讲介绍过了,就不再赘述。值得一提的是,如果子类新建了与父类同名的方法则会覆盖掉父类同名的方法,但父类不受影响

下面我们来举一个例子:

import random as r        #引入随机数的库


class Skate: #新建一个滑板的类


def __init__(self): #重写init方法
self.temp = r.randint(0, 1)




def treflip(self):
print("我出了%d个大乱"% self.temp)


class Pjj (Skate): #继承滑板父类
pass


class Yh (Skate): #继承滑板父类


def __init__(self):
super().__init__() #supe()r函数,稍后讲解
self.judge = False
def say (self): #判断是否作出大乱
if self.judge:
print("我夜寒也会大乱")
else:
print("大乱太简单了,没意思")
self.judge = True


  上面我们定义了一个滑板的类,在实例化对象时会传入一个随机数判断出了几个大乱(0或1)。下面的Pjj继承了Skate的类,Yh也继承了Skate的类同时作出了一点调整,加入了方法say判断夜寒是否出大乱。

下面我们运行这个代码:

>>> p = Pjj()                #实例化参数
>>> p.treflip()
我出了1个大乱
>>> y=Yh()
>>> y.treflip()
我出了0个大乱
>>> y.say()
大乱太简单了,没意思
>>> y.say()
我夜寒也会大乱


     我们可以看到,两个人的类都可以使用滑板作招的类,这就是缘于继承。这里讲解一下super()函数,我们可以看到我们在定义Yh的类时重写了父类的__init__方法,这会导致方法被覆盖,于是我们使用了super函数来引入需要的父类的方法,用法super().<方法名>()


★ 二、多重继承 ★


  从字面就可以看出,多重继承指,一个子类继承多个父类,使用方式<子类名>(父类1, 父类2, …)

下面举个例子:

class C1:                    #父类1
def M1(self):
print("我是父类1")


class C2: #父类2
def M2(self):
print("我是父类2")


class C3(C1, C2): #多重继承的子类3
def M3(self):
print("我是子类")


下面我们运行这段代码:

>>> c1=C1()
>>> c2=C2()
>>> c3=C3()
>>> c3.M1()
我是父类1
>>> c3.M2()
我是父类2
>>> c3.M3()
我是子类
>>> c3.M1()
我是父类1
>>> c3.M2()
我是父类2


这样我们就能看出子类C3可以使用多个父类的方法。


★ 三、组合 ★


  在我们编程时会遇到需要定义的几个关系不是很明确的类,使用继承会奇怪,这时候便需要组合。这么说恒难理解。

下面我们来举个例子:

class Yh:
def __init__(self,x):
self.num = x


class Pjj:
def __init__(self,x):
self.num = x


class Ground:


def __init__(self,m,n):
self.yh = Yh(m) #使用组合
self.pjj = Pjj(n)
def count(self):
print('场地里有%d个潘家杰,%d个夜寒'%(self.yh.num,self.pjj.num))


       组合就是把类的实例化的对象放到一个新的类里,这就是组合,(个人觉得可以按照自递归理解)。
然后我们来运行这段代码

>>> g = Ground(1, 1)
>>> g.count()
场地里有1个潘家杰,1个夜寒


★ 四、一些相关的BIF ★


issubclass(class, classinfo)

检查class是不是classinfo的子类,注意:自身可以是自身的子类,classinfo也可以是个元组


isinstance(object, classinfo)

检查object是不是classinfo的实例对象,注意:如果object传入的不是object类型则会显示False,若classinfo传入的不是class类型则会报TypeError错误。


hasattr(object, name)

测试object是否有名为name的属性。例:

>>> class A:
def __init__(self, x=0):
self.x = x


>>> a=A()
>>> hasattr(a, 'x') #测试x是否为a内的属性
True


getattr(object, name, default)

测试object是否有名为name的属性,如果有返回True,否则返回Default的值。例:

>>> class A:
def __init__(self, x=0):
self.x = x


>>> getattr(a, 'y', '没有') #测试y是否为a的属性


setattr(object, name ,value)

设置对象(object)中指定属性(name)的值(value),若无指定属性,新建一个属性。例:

>>> class A:
def __init__(self, x=0):
self.x = x


>>> getattr(a, 'y', '没有')
'没有'
>>> setattr(a, 'y', '夜寒信息')
>>> getattr(a, 'y', '没有')
'夜寒信息'


delattr(object, name)

删除对象中指定属性,若属性不存在产生AttributeError,例:

>>> class A:
def __init__(self, x=0):
self.x = x


>>> delattr(a, 'y')
>>> delattr(a, 'y')
Traceback (most recent call last):
File "<pyshell#19>", line 1, in <module>
delattr(a, 'y')
AttributeError: y



property(fget, fest, fdel, doc)

通过属性来设置属性,例:

>>> class Y:
def __init__(self, yh = '夜寒信息'):
self.yh = yh
def getYh(self):
return self.yh
def setYh(self, value):
self.yh = value
def delYh(self):
del self.yh
w = property(getYh, setYh, delYh)


>>> y = Y()
>>> y.getYh()
'夜寒信息'
>>> y.w
'夜寒信息'
>>> y.w = '欢迎关注夜寒信息'
>>> y.w
'欢迎关注夜寒信息'
>>> del y.w
>>> y.w
Traceback (most recent call last):
File "<pyshell#49>", line 1, in <module>
y.w
File "<pyshell#42>", line 5, in getYh
return self.yh
AttributeError: 'Y' object has no attribute 'yh'

       这样我们可以看出,我们只需要更改w的属性便可以更改类的属性,fget为获取属性的方法,fset为设置属性的方法,fdel为删除属性的方法。



继续学习 请关注我们



点个在看吧

Python进阶:类和对象(三)_子类




举报

相关推荐

0 条评论