面向对象概念
面向对象(Object-Oriented,简称OO)是一种编程范式,它以对象为中心
来组织代码和设计程序。在面向对象编程中,主要的概念包括对象、类、封装、继承和多态
。
面向对象在python中的位置
Python是一种多范式编程语言
,支持面向过程、面向对象、函数式编程
等多种编程风格。但其中,面向对象是Python最为强调和推荐的编程方式。
Python的许多内置类型(如列表、字典、字符串等)都是通过面向对象来实现的,这体现了OOP在Python设计中的深远影响。
面向对象基本概念
类(Class)
想象一下你有一个饼干模具,这个模具定义了饼干的形状和大小。在Python中,类就像这个饼干模具,它定义了对象应该有的属性(比如颜色、大小)和行为(比如走路、说话)
。
对象(Object))
使用这个模具烤出来的每一个饼干都是一个对象
。在Python中,对象是类的实例,每个对象都可以有自己的独特属性,但它们都遵循类定义的行为
。
属性(Attribute)
这些是对象拥有的特征,比如一个饼干的大小、颜色等。
方法(Method)
这些是对象可以执行的行为,比如一个人可以走路、说话或跑步。在Python中,方法就是定义在类中的函数
。
封装
这就像把饼干的所有原料(属性)和制作方法(方法)都封装在一个模具(类)里。外部只能通过模具来制作饼干,而不能直接改变原料或方法
。
继承
假设你有一个基本的饼干模具,然后你想制作一种特殊的巧克力饼干。你不需要重新制作一个全新的模具,只需要在原有的基础上添加巧克力即可。在Python中,继承允许你创建一个新的类,它继承了一个现有类的所有属性和方法,然后你可以添加或修改这些属性和方法
。
多态
这意味着不同的对象可以以不同的方式响应相同的消息
。比如,你有一个指令“咬一口”,对于巧克力饼干和普通饼干,这个指令的结果是相同的,但味道可能不同
。在Python中,多态允许你编写更通用的代码,因为你可以对不同类型的对象使用相同的接口。
代码实例
创造类、对象实例化、私有属性
我们创造一个动物的类,这个类的属性是名称、颜色、年龄,能做的行为是会跑、会吃;
Python 中类的定义使用 class
关键字;
# 创造Animal 类
class Animal:
name:str
age:int
color:str
def __init__(self, name, age, color):
self.name = name
self.age = age
self.color = color
print(name+"初始化")
def run(self,instance):
print(self.name + '跑了'+ instance + "米")
def eat(self, food):
print(self.name + '吃了' + food)
# 实例化
dog = Animal("狗",3,"棕色")
cat = Animal("猫",5,"白色")
通过上图可以知道,类里面定义的__init__方法
会在对象实例化的时候调用,而定义的run、eat方法在实例化的时候并不会调用,我们也称__init__为构造方法
;无论构造方法还是其他方法都需要将 self 作为第一个参数,它代表类的实例。
里面的run方法,可以通过实例对象来调用dog.run()
上面我们定义的属性都是需要初始化的,这种属性是实例化属性,通过类名是无法访问的,会报错
我们在类上面挂载一个属性,这个属性就是静态属性;
举例几条腿属性legCount;
如果静态属性不想被外部访问,可以变成私有静态属性,可以在属性名前加两条下划线__legCount,
继承
Python 不仅仅支持单继承,还支持多继承
# 单继承
class Dog():
name:str
def __init__(self, name:str):
self.name = name
def bit(self, time):
print(self.name,"叫了"+time+"分钟")
class singleDog(Dog):
pass
dog = singleDog("汪汪队")
dog.bit("30")
class Dog():
name:str
def __init__(self, name:str):
self.name = name
def bit(self, time):
print(self.name,"叫了"+time+"分钟")
class Cat():
name:str
def __init__(self, name:str):
self.name = name
def eat(self, food):
print(self.name, "吃了" + food )
# 多继承
class DogaAndCat(Dog,Cat):
pass
dogcat = DogaAndCat("猫狗")
dogcat.eat("苹果")
dogcat.bit("30")
如果继承的父类方法不能满足我们的需求,这时子类可以重写父类方法
class Dog():
name:str
def __init__(self, name:str):
self.name = name
def bit(self, time):
print(self.name,"叫了"+time+"分钟")
class singleDog(Dog):
def bit(self, time):
print(self.name, "叫了" + time + "分钟--重写的")
dog = singleDog("汪汪队")
dog.bit("30")