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()

注:为了提高代码的可读性,多继承中,多个父类内尽量不要定义相同名称的方法