牛逼!Python的类和对象(长文系列第⑤篇)(下)

继承

所谓继承就是一个新类在另一个类的基础上构建而成,这个新类被称作子类或者派生类,而另一个类被称作父类、基类或者超类,而子类会继承父类中已有的一些属性和方法。

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、isssubclass(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函数和文件操作(长文系列第3篇)(上)


下一篇:牛逼!Python函数和文件操作(长文系列第3篇)(中)