面向对象编程(OOP)是一种编程范式,它使用“对象”来设计软件。对象可以包含数据(通常称为属性)和代码(通常称为方法)。Python是一种多范式的编程语言,支持过程式、面向对象以及部分函数式编程。面向对象编程(OOP)是Python中一种强大的编程技术,它可以帮助我们以一种更自然和模块化的方式来构建复杂的应用程序。
一、什么是面向对象
面向对象编程是一种将现实世界实体转化为代码中对象的方法。每个对象都是一个独立实体,拥有自己的属性(数据)和方法(行为)。OOP的核心概念包括:
-
类(Class)
蓝图或模板,用于创建对象。 -
对象(Object)
类的实例,具有状态和行为。 -
核心原则
-
三大特征:
- 继承(Inheritance):允许新类基于现有类创建,扩展或修改现有类的行为。
- 封装(Encapsulation):隐藏对象的内部状态和实现细节,只暴露出一个可以被外界访问和操作的接口。
- 多态(Polymorphism):允许同一个接口接受不同的数据类型。
-
抽象(Abstraction)
抽象是从复杂现实世界中提取出关键特征的过程,忽略那些对当前目标不重要的细节
-
二、类与对象
1、类 与 实例
# 类的定义 大驼峰命名法 每个单词首字母大写相连
# 类 :是一个模板
class Dog:
""" 狗 """
# 初始化函数 实例化对象就会调用的函数
def __init__(self, color, name):
"""
self 构造的实例
"""
print("初始化函数")
# 实例属性
self.color = color
self.name = name
# 实例方法
def set_name(self, name):
self.name = name
def set_color(self, color):
self.color = color
def get_name(self):
return self.name
def get_color(self):
return self.color
# 类名() 调用类名 会执行该类的初始化函数
dog1 = Dog("黄色", "大黄")
# 通过实例方法来改变实例 的属性值
dog1.set_name("大黑")
print(dog1.get_name())
2、 构造函数与析构函数
class MyTest:
# 构造函数:创建并返回实例
def __new__(cls, *args, **kwargs):
instance = super().__new__(cls)
return instance
# 初始化函数:self 已经创建完成 可以向self 中添加数据
def __init__(self):
print("初始化函数")
# 析构函数:销毁实例 清理实例内存 使用不再使用 时 回收实例内存之前 执行对应的析构函数
def __del__(self):
return print("销毁")
# 实例化对象
my = MyTest()
print(id(my), my is None)
3、数据的访问级别:public, private, protect
"""
公有数据(public) : 类内类外均可访问
私有数据(private) : 类内 可访问 以 双下划线 开头命名的属性和方法 一般使用set、get 方法去调用
保护数据(protect) : 类内 可访问 类外可强制访问 以 单划线 开头命名的属性和方法
为子类而设计 子类访问
"""
class Person:
def __init__(self, name, age, sex):
self.name = name
self.__age = age
self._sex = sex
def set_age(self, age):
self.__age = age
def get_age(self):
return self.__age
# 当实例被print()时 执行
def __str__(self):
return f'姓名:{self.name} 年龄:{self.get_age()} 性别:{self._sex}'
class SuperPerson(Person):
def __str__(self):
return f'姓名:{self.name} 性别:{self._sex}'
p0 = Person("张飞", 20, "男")
print(p0, p0.name, p0.get_age(), p0._sex)
sp = SuperPerson("哈哈", 19, "超人")
print(sp)
4、类 中 内容
# 编写 静态方法 类方法 类属性 实例属性 实例方法
# 静态方法是一种不需要类或实例的属性就可以调用的方法
# 它们通常用于工具函数或与类相关的函数
class AudioHelp:
@staticmethod
def die_audio():
print("啊 旮旯")
@staticmethod
def live_audio():
print("复活吧 我的 爱人")
AudioHelp.die_audio()
AudioHelp.live_audio()
# 类属性是属于类本身的属性,由所有实例共享
# 类方法是与类相关联的方法,可以通过类名直接调用
class MyClass:
MYNAME = "唐三"
# 类方法 使用装饰器 修饰
@classmethod
def class_method(cls):
print("嘿嘿")
def __init__(self, name):
self.name = name
def __str__(self):
return f'{self.name} 打倒唐三 强娶比比东'
# 通过类名 访问类属性 可 设置类的属性
MyClass.MYNAME = "小舞"
# 实例方法 实例属性
mc = MyClass("小刚")
print(mc)
# 通过实例 访问类属性 不可 设置类的属性
mc.MYNAME = "比比东"
print(MyClass.MYNAME, mc.MYNAME)
MyClass.class_method()
5、抽象类
抽象在Python中的实现
-
抽象类:使用
abc
模块中的ABC
类(Abstract Base Class)来定义不能被实例化的抽象基类。 -
抽象方法:使用
@abstractmethod
装饰器来定义没有实现的方法,这些方法必须在派生类中被重写
from abc import ABC, abstractmethod
class Animal(ABC):
@abstractmethod
def walk(self):
print("走")
class Cat(Animal):
def walk(self):
print("窜来窜去")
class Chicken(Animal):
def walk(self, speed):
speed = speed
print("唱跳rap", speed)
c = Chicken()
c.walk(2.5)
6、动态地向类中添加内容
python是一门解释性语言,可以动态的向类中添加内容
import types
class Person:
pass
p1 = Person()
# 动态添加实例属性
p1.name = "刘备"
print(p1.name)
# 动态添加实例方法
# 参数 要与 类中参数要求一致
def my_set_name(self, name):
self.name = name
# 使用types.MethodType()动态添加实例方法
p1.set_name = types.MethodType(my_set_name, p1)
p1.set_name("曹操")
print(p1.name)
# 添加 类属性 该类的每个实例都可访问
Person.MAX_AGE = 180
print(Person.MAX_AGE)
print(p1.MAX_AGE)
# 向类中添加类方法 方法格式符合类方法格式 类与所有实例均可访问
@classmethod
def my_max(cls, a, b):
return a if a > b else b
Person.max = my_max
print(Person.max(a=20, b=30))
# 向类中添加静态方法 方法要符合静态方法格式 类与实例均可访问
@staticmethod
def my_sum(a, b):
return a + b
Person.sum = my_sum
print(Person.sum(100, 20), p1.sum(19, 29))