放弃考研,准备春招!
近期学了python面向对象,开始总结
一、概念
面向对象其实在生活中很常见,我们人的一切行为活动其实都是一个面向对象的过程。
跟以往不同,面向对象过程总是先定义出类,在类中写好属性和方法,然后调用这个类来实现此功能。就好比在生活中,我们总是先制造好各种类型的物品,定义好他的固有属性和功能,当我们需要的时候,再从这些制造好的物品中选择适合的一样。这个类是一个抽象的概念,而这个对象则是实实在在存在的具体的某一事物。
二、集成开发环境(IDE )pycharm
从今天开始,我们使用集成开发环境pycharm编辑运行面向对象的代码。具体安装步骤和配置命令网上资料很多,就不多赘述了。
三、类、属性、方法、对象的定义
在python中,我们使用class关键字来定义类。在类中,我们需要创建其属性和方法。然后我们还需要创建对象。
定义类语句如下:
class 类型名称(父类名称,父类名称……):
在Java中,创建对象的语句为:
类名称 对象名称 = new 类名称()
与Java等强数据类型语言不同,python创建对象的语句很简单。
创建对象语句如下:
对象名称 = 类名称()
然后我们如果需要调用类的属性,则可以通过以下语句实现:
对象名称.属性
在创建好的类中,我们可以设置其属性和方法,也可以进行初始化。例如:
"""创建一个名为User的类"""
class User(object):
def __init__(self): #初始化
self.name = "zzy" #定义初始化属性
self.age = 21
def msg(self): #定义方法
print("我的名字是{},我的年龄是{}".format(self.name, self.age))
u1 = User() #创建对象
print(u1.name) #调用属性并打印
print(u1.age) #调用属性并打印
u1.msg() #调用msg方法
结果如下:
四、面向对象的三大特征
面向对象有三大特征,分别是:封装、继承、多态。
1、封装
封装在我们现实生活中就是奖一个东西与其他东西隔绝开来,外面不能直接看到被封装在里面的东西。
在python的面向对象过程中,也可以对其进行封装。这里的封装操作指的是将属性私有化,并提供公开的方法来访问和设置的做法。
概念有点抽象,其实就是将定义的类里面的属性私有化,让他只能在这个类里面访问和修改,如果不给他设置公开的方法,类外是无法直接访问和修改这个属性的。只有在类里设置了公开的访问和修改办法,类外才可以恢复正常访问和设置操作。
具体操作为,在定义属性是,属性名称前面加上__即可
例如:
class User(object):
def __init__(self): #初始化
self.__name = "zzy" #定义初始化属性
self.age = 21
这里的self.__name 就是私有属性,self.age是公有属性。如果这时我们要在外面访问name这个属性,则会报错,错误原因为找不到name这条属性,即成功被封装。
所以要想成功的访问私有属性,我们需要设置公开的方法。
这里有两个方法,分别是gatter和setter,对应实现访问(gatter)和设置(setter)两个功能。封装有三种写法:
第一种:
def get_name(self): #定义访问方法使外面可以正常访问到私有属性name
return self.__name
def set__name(self, name) #定义设置方法使外面可以正常对私有属性name进行设置
self.__name = name
我们在外面访问和设置是,应通过调用这两个方法实现:
如:
print(u1.get_name()) #访问私有属性
name = u1.set_name("hst") #设置私有属性
print(name)
第二种:
利用property全局函数进行二次封装
代码为第一种写法的后面再加一句 name = property(get_name, set_name)
好处是可以达到隐藏数据的目的。说白了就是你以为你访问到了其实只是我给你提供的“伪接口”(name)
第三种:
利用装饰器
@property
def name(self):
return self.__name
@name.setter
def name(self, name):
self.__name = name
三种写法结果均相同
2、继承
继承就是继承定义类时类名称后面括号里的内容,即他的父类。继承只能继承他的公共属性,而不能继承其私有属性。
python是多继承实现机制。
如果多个父类中存在重名的方法时,自类对象调用时的顺序不一样。
在python2中分为新式类和旧式类(经典类)。新式类是遵从广度优先继承,即谁是最后一个继承谁,即重写和覆盖。而旧式类(经典类)遵从深度优先继承,即谁定义的方法和属性更多则继承谁。
在 python3只有新式类,故遵从广度优先继承。
这里牵扯到一个概念,即重写和重载的区别。
重写:
就是重新写一个方法然后覆盖掉之前的。
重载:
python中不存在重载。在其他编程语言中,对函数有重载这个概念,即当函数名相同,但参数类型和数量不同时,使用重载,这时重名函数可以同时存在,在对应不同的条件时运行其中适用的。如果函数名、参数类型和数量相同则会报错。
3、多态
在继承的基础上,父类引用指向子类实例的现象,叫做多态。
五、异常处理
1、概念
程序在运行过程中,因为某些原因(BUG、用户误操作、软硬件、网络……),引起的程序奔溃,无法正常运行的现象,叫做异常。我们处理异常就是为了使代码更加稳定的运行,异常处理是一种容错。
2、处理方法
用try—except抓取处理异常
try用来抓取异常,正常情况下不会进入except,一旦出现异常,则立即进入except中对其进行处理。finally下的语句为必须执行的代码,不管有无异常都会执行,优先级最高。语句如下:
try:
# 可能出现异常代码
except:
# 如果说出现了异常,则代码立刻就进入except
finally:
#必须要执行的代码
这里我们通过一道题理解:
输入两个数,计算第一个数与第一个数和第二个数之商的和(num1+ num1/ num2)
num = 0
try:
num = int(input("请输入一个数:"))
a = int(input("请再输入一个数:"))
b = num / a
except ValueError as e: #此为检测异常并显示异常信息的语句
print("出现异常,信息是:", e)
num = int(input("必须是整数,请再次输入:"))
a = int(input("请再输入一个数:"))
except ZeroDivisionError as z: #此为检测异常并显示异常信息的语句
print("出现异常,信息是:", z)
a = int(input("除数不能为0,请再次输入:"))
except Exception as e: #此为检测异常并显示异常信息的语句
print("其他错误")
finally: #不论是否异常都会执行
print("zzy")
b = num / a
print(f' {num} + {b} = {num + b}')
结果为:
正常情况:
第一个数输入异常:
第二个数输入异常:
除数为0异常:
面向对象的学习基本完成,后面开始python高级部分的学习。