目录
一,何为面向对象?
1.何为类?
类是面向对象编程中的一个概念,指的是一类具有相同属性和行为的对象的抽象。类可以看作是一种模板或蓝图,描述了对象的属性和方法。通过定义一个类,可以创建多个具有相同属性和行为的对象。类由属性和方法构成,属性用于描述对象的特征,方法用于描述对象的行为。通过实例化类,可以创建对象,并对对象进行操作。类是面向对象编程中封装、继承和多态的基础。
2.何为实例?
实例是指在编程中创建的一个具体对象。在面向对象的编程中,类是一种模板或规范,描述了对象的属性和方法,而实例是根据类创建出来的具体对象。每个实例都有自己独立的属性值,可以调用类中定义的方法来操作这些属性。通过实例化多个对象,可以同时处理不同的数据和逻辑,实现代码的复用和扩展。
3.何为面向对象?
面向对象编程,简单来说,就是对对象进行操作,对象的属性和功能又由类来规定
它将程序的功能划分为一个个相互独立的对象,并通过对象之间的交互来实现程序的功能。
在面向对象编程中,对象是程序的基本单位,它具有状态(属性)和行为(方法)。对象可以根据定义的类(Class)进行创建,类是对象的抽象描述,包括了对象的属性和方法的定义。通过类的实例化,可以创建具体的对象。
4.类与实例的声明
class Person:
'''
声明一个类:Person 要用class 类名(一般类名首字母要大写)
'''
pass
# 实例如何定义 变量名 = 类名(初始化时要赋值的实参)
a = Person()
二,类中常用的函数
1.初始化与字符串表示函数
<1>初始化函数
初始化函数的作用是在对象创建时进行一些必要的初始化操作,比如给对象的属性赋初始值。初始化函数在类的定义中以__init__
来命名,它接受的参数包括self
和其他需要初始化的参数。
<2>字符串表示函数
__str__
是一个特殊的方法,用于返回一个对象的字符串表示形式。__str__
方法应该返回一个字符串,描述该对象的特征和状态
返回内容可以自定义
class Person:
'''
声明一个类:Person 要用class 类名(一般类名首字母要大写)
'''
def __init__(self, name, age):
'''
self 就是未来的实例
初始化self也等同于初始化未来的实例
'''
# print(f'我是人')
self.name = name
self.age = age
def __str__(self):
return f"姓名:{self.name} 年纪:{self.age}"
# 实例如何定义 变量名 = 类名(初始化时要赋值的实参)
a = Person('小龙', 20)
这里封装了一个“人”类,在初始化类中规定了 self(也就是未来的实例)要有 name age 这两个属性
而 a = Person('小龙', 20) 则是该类的一个实例,因为类规定了要有两个形参,所以要带有两个实参
字符串表示函数,则返回了实例的姓名和年纪,这样就可以直接打印实例的姓名和年纪,可以更加清楚的知道实例的这些属性
print(p)
返回值为
姓名:小龙 年纪:20
2.构造函数与析构函数
<1>构造函数
构造函数一般用来构造初始化函数中的 self 的,如果不设置的话,就默认该类的父类中去调用
构造函数用__new__来定义
class MyClass:
def __new__(cls, *args, **kwargs):
# pass# 当构造函数内没有内容时,初始化函数就不再执行
instance = super().__new__(cls)
# 这里从该类的父类中构造了一个self 与默认不设置构造函数时一样
# 构造函数之后要返回
return instance
def __init__(self):
print(f'初始化函数执行了')
mc = MyClass()
<2>析构函数
析构函数:当实例不在使用,把实例清空删除,释放空间
使用__del__来定义
析构函数使用场景:
- 资源释放:当一个对象在使用过程中申请了一些资源,比如内存、文件句柄等,需要在对象被销毁时释放这些资源。这时可以在析构函数中编写释放资源的代码。
- 日志记录:当一个对象被销毁时,可以在析构函数中记录日志,用于调试或跟踪对象的生命周期。
- 还原状态:当一个对象被销毁时,可以在析构函数中还原对象的状态或环境,以保证后续操作的正确性
3.其他的一些魔法函数
以双下划线开头和结尾,__函数名__
魔法函数不需要自己调用,当满足一定触发条件时,自动触发使用
除了上述的 初始化函数___int__ 字符串表示函数__str__ 构造函数__new__ 析构函数__del__
这些常用的外,还有:
比较
__eq__ 使用 == 时触发
__ne__ 使用 != 时触发
__gt__ 使用 > 触发
__ge__ 使用 >= 触发
__lt__ 使用 < 触发
__le__ 使用 <= 触发
计算
__add__ 使用+触发
__sub__ 使用-触发
__mul__ 使用*触发
__truediv__ 使用/触发
__floordiv__ 使用//触发
__mod__ 使用%触发
__divmod__ 使用div(x,y)触发
三,面向对象的三要素
1.封装
面向对象的封装是指将数据和操作封装在一个对象中,通过定义公共接口对外提供访问和操作数据的方式,同时隐藏了对象内部的实现细节。封装实现了数据的隐藏和保护,使得对象的属性和方法只能通过定义的接口进行访问,而无法直接操作。
封装的主要目的是保护对象的状态,确保对象的数据不会被意外修改或破坏,提高代码的可维护性和可复用性。通过封装,对象的内部实现可以根据需要进行修改,而不会影响到外部使用该对象的代码。
封装也可以实现信息隐藏,将对象的内部细节隐藏起来,只暴露必要的接口,减少了代码的耦合性,提高了代码的可读性和安全性。
在封装的过程中,常用的实现手段是定义类和访问修饰符。类是封装的基本单位,将数据和方法封装在一起,通过实例化对象来使用。访问修饰符用于控制成员的访问权限,提供了公共访问和私有访问的方式,以实现对数据的保护和隐藏。常用的访问修饰符包括public、private和protected。
总之,面向对象的封装是将数据和操作封装在对象中,通过定义公共接口对外提供访问和操作数据的方式,实现了数据的隐藏、保护和信息隐藏,提高了代码的可维护性、可复用性、可读性和安全性。
2.继承
继承是面向对象编程中的一种机制,通过它可以使一个类(称为子类)获取另一个类(称为父类)的属性和方法。子类可以继承父类的公有属性和方法,并可以重写或扩展这些属性和方法,从而实现代码的复用和功能的扩展。
在继承关系中,父类的属性和方法被继承下来后,子类可以直接使用父类的这些属性和方法,不需要重新定义或实现。这样可以大大减少开发过程中的代码冗余,提高代码的可读性和可维护性。
继承可以分为单继承和多继承。单继承指一个子类只能继承一个父类,多继承指一个子类可以继承多个父类。在单继承中,子类只能继承一个父类的属性和方法。在多继承中,子类可以继承多个父类的属性和方法,但需要注意解决可能发生的命名冲突问题。
继承的好处在于提高了代码的可复用性和可扩展性。通过继承,可以将共性的代码放在父类中,子类只需关注自己特有的属性和方法,减少了代码的重复编写。同时,当需要对已有的类进行功能扩展时,只需在子类中添加或重写相关的属性和方法即可,不会影响到父类和其他的子类。这样可以大大减少了代码的维护成本。
继承的一个重要概念是“is-a”关系,即子类是父类的一种特殊形式。例如,一个狗类(Dog)可以继承一个动物类(Animal),因为狗是一种动物。通过继承,可以实现更加抽象和通用的代码设计,提高了代码的可读性和可理解性。
总之,继承是面向对象编程的重要概念之一,通过它可以实现代码的复用和功能的扩展。在继承的过程中,子类可以继承父类的属性和方法,并且可以重写或扩展这些属性和方法,从而实现对代码的灵活使用和改造。
3.多态
多态是面向对象编程的一个重要特性,它允许使用一个父类类型的引用变量来引用子类类型的对象,从而实现方法的动态绑定。多态的特点是编译时不确定具体调用的方法,而是在运行时根据实际对象类型来确定调用的方法。
多态可以提高代码的灵活性和可扩展性,可以实现代码的解耦和重用。通过多态,可以通过父类类型的引用变量调用子类类型所特有的方法,同时可以统一处理不同子类对象的共同属性和行为。
在实现多态的过程中,需要满足两个条件:继承关系和方法重写。只有在存在继承关系的父类和子类中,且父类中的方法被子类重写后,才能实现多态。
多态可以通过抽象类和接口来实现。抽象类是一种特殊的类,它不能被实例化,只能被继承。抽象类中可以定义抽象方法,而抽象方法没有具体的实现,需要在子类中实现。接口是一种抽象数据类型,它定义了一组方法的集合,但没有具体的实现。一个类可以实现多个接口,从而实现多态。
总之,多态是面向对象编程的一个重要特性,在代码设计和开发中起着重要的作用,可以提高代码的灵活性和可扩展性。