python面向对象
本文针对面向对象编程做了相关python语法的梳理,供大家学习参考,有关python基础、python常见数据类型详解大家可看我之前写过的文章,链接在下面。
类和对象
类的定义
-
成员变量
class 类名: 变量1 = None 变量2 = None
-
成员方法
成员方法需要使用
self
传入参数来标记,self用于调用类中的其他变量,在实际使用中可不理会,但需注意在类中成员方法的定义时需要指定第一个参数为selfclass 类名: 变量1 = None 变量2 = None def(self,a): print(f"{self.变量1},{a}")
-
内置方法
-
构造方法 :_init_
同样需要指定
self
关键字,用来调用成员变量使用__init__标识构造方法,创建对象时,方法自动执行
self.变量名子相当于声明变量,故在python中变量可提前声明,也可不提前声明
class 类名: 变量1 = None 变量2 = None def(self,a): print(f"{self.变量1},{a}") def __init__(self,变量1,变量2): self.变量1 = 变量1 self.变量2 = 变量2
-
字符串方法 :_str_
直接打印对象会打印地址值,__str__方法可改变打印对象对应的输出值
类似于Java的toString()方法
def __str__(self): return f"name:{self.name},age:{self.age},gender:{self.gender}"
-
类比较方法:_lt_
用于对象之间的比较,可指定具体比较的变量
小于与大于
def __lt__(self, other): return self.age<other.age
-
类比较方法:_le_
用于对象之间的比较,可指定具体比较的变量
小于等于与大于等于
def __le__(self, other): return self.age<=other.age
-
相等比较方法:_eq_
用于类对象之间的相等判断,若没实现则默认比较内存地址
可指定具体比较值
def __eq__(self, other): return self.age==other.age
-
对象创建
# 空对象
对象名 = 类名()
# 构造方法创建对象
对象名 = 类名(变量1,变量2)
# 变量的赋值与修改
对象名.变量名 = 值
封装
面向对象思想将事物分为属性与行为,现实事物中,有对外开放的属性与行为,也有不对外开放的属性与行为,将属性与行为分为开放与私有,私有的属性与行为不给类对象使用,只给内部属性与行为 自己使用,以达到隔离区分,体现的即为封装思想
-
私有变量
以"__"开头
__example = None
-
私有方法
以"__"开头
__example = None def __example_method(self): print("I am a private method")
-
例子:
class test: __example = None def __example_method(self): print("I am a private method") # 访问私有变量与方法 def use_my_private(self): self.__example = 1 self.__example_method()
继承
基于已有的类,修修改改成为新的类,默认继承所有,当继承后满足需求,在新类中不想写新内容时,使用pass关键字标识,
单继承
- 当前新类称为子类,被继承的类称为父类
- 语法:class 子类(父类):
多继承
- 子类允许有多个父类,父类之间使用,隔开
- 父类间的顺序代表继承顺序,若变量或方法名相同,优先继承前面父类的变量与方法
- 语法:class 子类(父类1,父类2):
复写
- 当继承的变量、方法不满足新需求,可在新类中重写变量名、方法名相同的变量与方法,覆盖原有的继承过来的变量与方法
- 复写变量、方法后,默认访问到复写的变量与方法,若想重新调用父类被复写的变量、方法,使用super()调用或使用父类名调用
多态
同一种行为,不同运行状态。在某些方法中,传入参数为父类对象,但传入子类对象也可以分别输出对应子类的方法结果 ,称为多态。
抽象类
-
含有抽象方法,即含有只定义了方法名,但具体方法体未实现的方法,使用pass关键字作为方法体
def add(x,y): pass
-
总结:一般抽象类作为顶层设计的抽象类只定义方法,不具体实现方法,不同子类根据功能实现方法。某方法以抽象类对象为形参,则可传入该抽象类的子类,并根据不同子类获得不同工作状态
异常
-
所有异常捕获
try: 可能出现异常的语句 except: 可能的异常出处理方式
-
多异常捕获
try: 可能出现异常的语句 except(error1,error2) as 异常别名: print(异常别名)
-
没有异常时的执行:else(可选项)
-
无论有没有异常都执行:finally(可选项)
try: 可能出现异常的语句 except: 异常处理方式 else: 没有异常的处理方式 finally: 有没有异常都要执行
-
异常传递性:异常可传递到最高调用者
def func1(): #以下语句异常 print(1/0) def func2(): func1() def main(): try: func2() except Exception as e: print(f"出现异常了,异常信息为:{e}") main()
注解
由于在python中,变量不需要先指定类型,所以有注解,并且能让IDE工具识别提示是有必要的
变量注解
-
格式1
变量名:类型名 = 值
#变量注解 num:float = 1.0 #数据容器注解 list1:list = [1,2,3] #类对象注解 class test: pass test1:test = test()
-
格式2
# type :类型
num = 2.0 # type:float lis1 = [1,2,3] # type:list list2 = [1,2] # type:list[int]
函数(方法)形参、返回值注解
-
形参注解
形参1:形参类型,形参2:形参类型
def add(x:int,y:int): return x+y
-
返回值注解
函数 -> 返回值类型:
def add(x:int,y:int)->int: return x+y
联合类型注解 Union
用于提示列表、元组等多类型的注解提示,需要导入Union包
-
案例
from typing import Union def prints(data:Union[int,str]): print(data)