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