面向对象第二期学习:
继承与多态:
在面向对象的程序设计中,当我们定义了一个新的类时,就可以从一些之前的旧的类中继承下来,而这个新类就是子类或者派生类,而旧的类就是父类或者基类,子类从父类继承父类的方法和属性。
class am():
def __init__(self,name,type):
self.__name = name
self.__type = type
def run(self):
print("am在run")
class dog(am):
#定义一个名字为dog的类
def __init__(self,name,type):
self.__name = name
self.__type = type
def what(self):
print(self.__name+"是一只"+self.__type)
if __name__ == '__main__':
do= dog('小黄','金毛')
do.run()
这样就可以用子类的对象去调用父类的方法。
python继承中的特点:
1、如果在子类中需要父类的构造方法就需要显试的调用父类的构造方法,或者不重写父类的构造方法
构造方法指的就是__init__(),
def __init__(self):
这时候就有两种方式:
第一种:
不重写父类的构造方法:
class am():
def __init__(self,name,type):
self.name = name
self.type = type
def run(self):
print("am在run")class fish(am):
def run(self):
print (self.name+'在run')
if __name__ == '__main__':
fl= fish("小鱼","金鱼")
fl.run()
ps:这里千万要注意,父类的属性不能加两个下划线进行数据封装,那样的话,子类调用父类的构造方法就会报错。如果子类重写父类的构造方法的就不会调用父类的构造方法
没有重写时:
重写时:
如果重写了__init__ (构造方法)时,要继承父类的构造方法,在子类的构造方法内使用 super 关键字:
super(子类,self).__init__(参数1,参数2,....)
如果在继承元组中列了一个以上的类,那么它就被称作"多重继承"
多态:
class am():
def __init__(self,name,type):
self.__name = name
self.__type = type
def run(self):
print("am在run")
class dog(am):
#定义一个名字为dog的类
def __init__(self,name,type):
self.__name = name
self.__type = type
def run(self):
print("dog在run")
def what(self):
print(self.__name+"是一只"+self.__type)
class fish(am):
def __init__(self, name, type):
self.__name = name
self.__type = type
def run(self):
print('fish在run')
if __name__ == '__main__':
do= dog('小黄','金毛')
do.run()
fl= fish("小鱼","金鱼")
fl.run()
多态的意思在我理解来就是,子类的对象既可以是子类,又属于父类。
Python同样有限的支持多继承形式。多继承的类定义形如下例:
class DerivedClassName(Base1, Base2, Base3):
<statement-1>
. . .
<statement-N>
需要注意圆括号中父类的顺序,若是父类中有相同的方法名,而在子类使用时未指定,python从左至右搜索 即方法在子类中未找到时,从左到右查找父类中是否包含方法。
__private_attrs:两个下划线开头,声明该属性为私有,不能在类的外部被使用或直接访问。在类内部的方法中使用时 self.__private_attrs。
在类的内部,使用 def 关键字来定义一个方法,与一般函数定义不同,类方法必须包含参数 self,且为第一个参数,self 代表的是类的实例。
self 的名字并不是规定死的,也可以使用 this,但是最好还是按照约定是用 self。
__private_method:两个下划线开头,声明该方法为私有方法,只能在类的内部调用 ,不能在类的外部调用。self.__private_methods。