面向对象概述
python是一门面向对象语言,面向对象的三大特性,封装、继承、多态,python支持多继承,这里与java语言等还是有区别的
创建类关键字 class ,类中包含属性和方法,通过类创建对象
python的类和对象
创建类的关键字为class
创建对象为 对象名=类名()
调用属性和方法 对象名.xxx
class Person:name = Nonegender=Noneage=Nonedef eat(self):print(f"{self.name}这个人在吃饭")def __init__(self,name,gender,age):self.name =nameself.gender=genderself.age=agezhangsan = Person("zhangsan","男",18)zhangsan.eat()"""
输出结果:
zhangsan这个人在吃饭
"""
类中成员方法创建第一个参数为self,指代本类对象,调用的时候python自动传入
def eat(self):print(f"{self.name}这个人在吃饭")
__init__(self,...) 此类方法为构造方法,类初始化的时候自动调用,与java类似
def __init__(self,name,gender,age):self.name =nameself.gender=genderself.age=age
创建对象
zhangsan = Person("zhangsan","男",18)
调用方法
zhangsan.eat()
私有成员变量和方法的定义,前边加两个下划线,即__xxx,对象不可以调用私有变量和方法
class Person:# 私房钱__money = 10000#通过公有方法访问私有成员def getMoney(self):return self.__money;#私有方法def __heigt(self):print("175cm")zhangsan = Person()zhangsan.getMoney()
python的类方法
用@classmecthod装饰符来表示,类方法只能访问类变量,不能访问实例变量
class Person:name = "lisi"def __init__(self,name,age):self.name=nameself.age=age# 类方法,只能访问 name = lisi的成员变量,通过构造方法传进来的会报错@classmethoddef getName(self):print(f"姓名是:{self.name}")zhangsan = Person("zhagnsan",13)zhangsan.getName()"""
输出结果:姓名是:lisi
"""
python的静态方法
通过@staticmethod装饰器来表示,该方法可以把@staticmethod下面的函数和所属的类截断,这个函数就不属于这个类,也没有类的属性,只不过要通过类名的方式调用
class Person:def __init__(self,name,age):self.name=nameself.age=age# 静态方法,类名调用@staticmethoddef testStatic():print("我是静态方法")Person.testStatic()
zhangsan = Person("zhangsan",18)
zhangsan.testStatic()"""输出结果我是静态方法我是静态方法
"""
python的属性方法
用@property装饰符表示,把一个方法变成一个静态属性,然后直接把它作为属性调用
class Person:@propertydef propertiesMethod(self):print("我是属性方法")a = Person()
# 如果a.propertiesMethod()会报错
a.propertiesMethod"""
输出结果
我是属性方法
"""
python的魔术方法
方法名 | 说明 |
__init__ | 类似构造器,在类生成对象后就会被执行 |
__del__ | 在对象消亡时执行 |
__call__ | 在类的对象被执行时被调用 |
__str__ | 在对象被str()包裹的时候会被执行 |
__int__ | 在对象被int()包裹的时候会被执行 |
__add__ | 在两个对象相加的时候,调用第一个对象的__add__方法,可以将第二个对象传递进来 |
__dict__ | 这个方法是以字典的形式列出类或对象中所有成员 |
__iter__ | 类对如果想变成一个可迭代的对象,那么对象中必须要有__iter__方法,并且这个方法返回一个迭代器 |
更多魔术方法的使用请参考:传送门
python的继承
python中的继承通过在类名后边写(xxx),python支持多继承
注意:父类和子类都重新定义了构造函数init()时,在进行子类实例化的时候,子类的构造方法不会自动调用父类的构造器,必须在子类中显示调用
class Student:def myName(self):print("我叫zhangsan")class Person(Student):def myAge(self):print("我18岁")a = Person()
a.myName()
a.myAge()"""
输出结果
我叫zhangsan
我18岁
"""
python的子类调用父类
python调用父类的成员变量和方法有两种方式
1、使用父类名.[成员变量|成员方法()]
2、super().[成员变量|成员方法()]
class Fu():name ="zhangsan"def test(self):print(f"名称为{self.name}")class Zi(Fu):def excuteFu(self):print(Fu.name)super().test()Zi().excuteFu()"""
输出结果
zhangsan
名称为zhangsan
"""
python的多态
多态性是面向对象重要的特征之一。“多态”是指对象可以表现出多种形态。经典例子例如:猫 狗 都属于动物,它们都有叫 动等行为,但是叫的方式与动的方式各不相同
def start(obj):obj.speak()class Animail():def speak(self):print("动物在叫")class Dog(Animail):def speak(self):print("狗在叫")class Cat(Animail):def speak(self):print("猫在叫")Dog().speak()
Cat().speak()
start(Dog())
start(Cat())"""
输出结果
狗在叫
猫在叫
狗在叫
猫在叫
"""
python的接口
python中没有interface关键字,python中的接口也就是抽象类
定义方式:
1、类声明加上metaclass=abc.ABCMeta
2、定义抽象方法,加注解@abc.abstractmethod,内容为pass,表示为空
注意事项:
1、抽象类不能实例化对象
2、继承实现抽象类的类必须实现所有抽象方法
3、抽象类可以定义实际方法
import abcclass AbsTest(metaclass=abc.ABCMeta):@abc.abstractmethoddef test(self):passdef test1(self):print("444")class AbsTestImpl(AbsTest):def show(self):print("555")def test(self):print("666")AbsTestImpl().test()
AbsTestImpl().test1()"""
输出结果
666
444
"""
python的异常处理
异常是Python对象,当Python无法正常处理程序时就会抛出一个异常。一旦Python脚本发生异常,程序需要捕获并处理它,否则程序会终止执行,与其他面向对象语言的异常处理类似,比如java
Python中所有异常类的根类是BaseException类,它们都是BaseException的直接或间接子类。大部分常规异常类的基类是Exception的子类
python的异常处理语法
处理异常的语法与其他语言类似
try:
可能出现异常的代码
expect Exception as 别名:
异常处理方法
else:
没有出现异常
finally:
一定会执行的代码
try:# 打开不存在的文件open("test.txt","r",encoding="UTF-8")
except Exception as e:print("出现异常")
else:print("123")
finally:print("一定会执行")"""
输出结果
出现异常
一定会执行
"""