6.Python面向对象编程
1、面向对象编程
面向对象编程(Object Oriented Programming,简称:OOP )是一种解决软件复用的设计和编程方法,就是根据现实社会中的事物,抽象出事物的属性和功能,
后然将抽象出来的属性和功能封装成对象的属性和方法,在软件中通过复用对象实例提高软件的开发效率 ,很多高级编程语言都遵循面向对象的编程方法。
2、类和对象
2.1、类:是一类事物的抽象,定义了一类事物的属性和行为
- 类的构成:类名、属性、方法
- 定义:
class 类名:
def 方法名(self[,参数列表]):
方法体
......
- 注意事项:
1.定义类时,使用class关键字声明这是一个类
2.类名的命名规则:通常按照约定的“大驼峰”命名法。例:class ElectricCar 电动车类
3.定义方法时,方法的第一个参数默认为self,表示对象自身
4.通过对象调用方法时,不需要在方法中传入self参数,python解释器会自动传入
class Cat:
def eat(self):
print("吃鱼。。。")
def drink(self):
print("喝水。。。")
def run(self):
print("跳舞。。。")
2.2、对象:是通过类创建的一个具体事物,具有状态和行为,可以做具体事情。
创建对象的过程:是在内存中开辟一块区域存储这个对象,这块内存区域有它的对应内存地址,通过内存地址就能找到这块区域存储的这个对象。
对象的引用:就是把存储这个对象的内存地址告诉了变量,这个变量就指向了内存中的这个对象,通过这个变量就可以找到它所指的这个对象,所以这个变量叫这个对象的引用。
# 根据Cat类创建对象
xiaohe=Cat()
#调用对象的方法
xiaohe.eat()
xiaohe.drink()
xiaohe.run()
#对比一个类创建多对象是否相同
xiaobai=Cat()
#id(对象)可以获取对象的内存地址
print("xiaohe的id:{}".format(id(xiaohe)))
print("xiaobai的id:{}".format(id(xiaobai)))
2.3、类与对象的关系:类相当于创建对象的基础条件,根据类可以创建多个对象。
3、__init__
构造方法
构造方法作用:是在创建一个类的对象时,对对象进行初始化操作。
python中类的构造方法名称是__init__
。定义类时,没有显示定义__init__
构造方法,创建对象时会自动调默认没有参数的__init__
构造方法
- 无参构造方法
class Cat:
#无参构造方法
def __init__(self):
print("初始化对象。。。")
def eat(self):
print("吃鱼。。。")
def drink(self):
print("喝水。。。")
def run(self):
print("跳舞。。。")
# 创建对象
xiaohe=Cat()
#调用对象的方法
xiaohe.eat()
xiaohe.drink()
xiaohe.run()
- 有参构造方法
class Cat:
#有参构造方法
def __init__(self,sex,age):
print("开始初始化对象。。。")
self.sex=sex
self.age=age
print("结束初始化对象。。。")
def eat(self):
print("吃鱼。。。")
def drink(self):
print("喝水。。。")
def run(self):
print("跳舞。。。")
# 创建对象
xiaohe=Cat("男",1)
print("xiaohe的性别:{},年龄:{}".format(xiaohe.sex,xiaohe.age))
4、访问权限
python中类的属性和方法的访问权限不需要任何关键字修饰,是通过属性或者方法名前加两个下划线区分:
私有访问权限:属性或者方法名前加两个下划线,只能在类内部方法。例:
__name
变量,__eat()
方法公共访问权限:不需要在属性或者方法名前加两个下划线,可以在外部访问。例:
name
变量,eat()
方法
class Cat:
#有参构造方法
def __init__(self,sex):
print("开始初始化对象。。。")
self.sex=sex
self.__age=age #私有属性
print("结束初始化对象。。。")
def eat(self):
print("吃鱼。。。")
def drink(self):
print("喝水。。。")
def __run(self):
print("跳舞。。。")
def get_info(self):
#调用私有属性和方法
print("年龄:{}".format(self.__age))
print("run方法:",self.__run())
# 创建对象
xiaohe=Cat("男",1)
xiaohe.get_info()
5、继承
面向对象编程的好处之一是代码重用,通过继承机制可以很好的实现代码重用。
5.1、单继承:就是子类只继承一个父类
- 格式:
class 子类名(父类名):
- 特点:子类只会继承父类的非私有属性和非私有方法
#定义动物类
class Animal:
def eat(self):
print("吃。。。")
def drink(self):
print("喝。。。")
def run(self):
print("运动。。。")
#定义子类
class Cat(Animal):
#猫除了继承父类属性好行为,还会捉老鼠行为
def catch(self):
print("捉老鼠。。。")
# 创建对象
xiaohe=Cat()
#调用对象的方法
xiaohe.eat()
xiaohe.drink()
xiaohe.run()
xiaohe.catch()
5.2、super函数
子类调用父类方法的方式:
- 5.2.1、
父类名.方法名(self[,参数列表])
:在调父类方法时,需要传入self参数,这个self是子类而不是父类的实例对象
class Cat(Animal):
#猫除了继承父类属性好行为,还会捉老鼠行为
def catch(self):
print("捉老鼠。。。")
#定义子类
class BlackCat(Cat):
#猫除了继承父类属性好行为,还会捉老鼠行为
def catch(self):
Cat.catch(self)
xiaohe=BlackCat()
xiaohe.catch()
- 5.2.2、
super.方法名
class Cat(Animal):
#猫除了继承父类属性好行为,还会捉老鼠行为
def catch(self):
print("捉老鼠。。。")
#定义子类
class BlackCat(Cat):
#猫除了继承父类属性好行为,还会捉老鼠行为
def catch(self):
super.catch()
xiaohe=BlackCat()
xiaohe.catch()
5.3、重写
就是在子类中定义与父类同名的方法。子类重写父类后调用时,只会调用子类中重写的方法
#定义动物类
class Animal:
def eat(self):
print("吃。。。")
def drink(self):
print("喝。。。")
def run(self):
print("运动。。。")
class Cat(Animal):
#猫除了继承父类属性好行为,还会捉老鼠行为
def run(self):
print("跳舞。。。")
xiaohe=Cat()
xiaohe.eat()
xiaohe.drink()
xiaohe.run()
5.4、多继承
是一个子类可以继承多个父类
- 格式:
class 子类名(父类1,父类2,父类3,...):
class God:
def change(self):
print("百宝箱变东西。。。")
class Cat:
def eat(self):
print("吃铜锣烧。。。")
class Doraemon(God,Cat):
def speak(self):
print("说人话")
a = Doraemon()
a.change()
a.eat()
a.speak()
注:为了提高代码的可读性,多继承中,多个父类内尽量不要定义相同名称的方法