python类和对象
3.属性和方法
3.6初始化方法/构造方法
在Python中,构造方法(也称为初始化方法)是一个特殊的方法,用于在创建对象时初 始化对象的属性。这个方法在类定义中使用__init__
来表示。当你创建类的新实例时,__init__
方法会自动被调用,从而允许你为对象设置初始状态或执行其他必要的启动任务。
以下是一个简单的Python类示例,该类包含一个构造方法
3.7魔法方法
在Python中,魔术方法(也称为特殊方法或双下划线方法)是一类具有特殊意义的方法,它们的名称前后都包含两个下划线(例如,__init__
、__str__
、__add__
等)。这些方法为Python对象提供了丰富的功能,允许对象以特定的方式响应内置函数和操作符。
以下是一些常见的Python魔术方法及其用途:
下面是一些例子帮助理解:
4.继承/派生
在Python中,继承是一种面向对象编程(OOP)的特性,它允许一个类(称为子类或派生类)继承另一个类(称为父类或基类)的属性和方法。通过继承,子类可以重用父类的代码,同时还可以添加或覆盖父类的功能。
4.1基本用法
要创建一个子类,你需要使用class
关键字,并在类名后面的括号中指定父类。如果父类在当前模块或内置模块中,你可以直接写类名。如果父类在另一个模块中,你需要使用模块名加点号再加类名的方式。
4.2多重继承
Python支持多重继承,即一个子类可以继承多个父类。多重继承可能会导致一些复杂的问题,比如方法名冲突(也称为菱形继承问题),但是Python的MRO算法通常能够很好地处理这些问题。
4.3 覆盖 override
-
覆盖是指在有继承关系的类中,子类中实现了与基类同名的方法,在子类的实例调用该方法时,实际调用的是子类中的覆盖版本,这种现象叫覆盖
-
作用:
-
实现和父类同名,但功能不同的方法
-
-
覆盖示例
5.封装
在Python中,封装(Encapsulation)是面向对象编程(OOP)的一个核心概念。它主要涉及到将对象的属性和方法结合在一起,并隐藏对象的内部实现细节,只对外暴露必要的接口。这样做的目的是增加代码的安全性和可维护性,同时减少不同部分之间的依赖。
-
隐藏内部实现:类的内部细节(如属性和方法)被隐藏起来,不对外部直接可见。这通常通过名称修饰(name mangling)或双下划线前缀(
__
)来实现,尽管Python并没有真正的私有变量或方法,但这是一种约定俗成的做法。 -
提供公共接口:类通过提供公共方法(也称为接口)来与外部世界交互。这些方法是类的外部用户唯一可以调用的。
-
保护对象状态:封装允许类控制对其属性的访问,从而保护对象的状态不被随意修改。这可以通过getter和setter方法来实现,它们分别用于获取和设置属性值。
在Python中,虽然没有严格的访问控制(如Java中的private
、protected
和public
关键字),但可以通过使用双下划线前缀:
6.多态
在Python中,多态(Polymorphism)是面向对象编程(OOP)的一个核心概念,它允许不同的类对象通过相同的接口调用方法。多态性主要分为编译时多态(也称为静态多态或方法重载)和运行时多态(也称为动态多态或方法重写)。Python主要支持的是运行时多态,这是通过继承和方法重写来实现的。
6.1多的基本概念
多态意味着“多种形态”,在编程中,它允许一个接口或父类引用指向子类对象,并通过这个引用调用在子类中重写的方法。这样做的好处是,可以在不改变客户端代码的情况下,通过替换不同的子类来实现不同的行为。
6.2Python中的多态实现
在Python中,多态通常是通过继承和方法重写来实现的。以下是一个简单的例子:
7.方法重写
在Python中,方法重写(Method Overriding)是面向对象编程(OOP)中的一个重要概念。它允许子类提供一个特定的实现,该实现会覆盖(或重写)在父类中定义的同名方法。这样做的目的是允许子类根据自身的需要定制或扩展父类的行为。
7.1方法重写的基本步骤
-
定义一个父类,并在其中声明一个或多个方法。这些方法可以是具体的实现,也可以是抽象方法(在Python中,抽象方法通常通过在父类中引发
NotImplementedError
异常来模拟)。 -
创建一个子类,该子类继承自父类。
-
在子类中重写父类中定义的同名方法。这意味着子类提供了一个新的实现,该实现将替换父类中的实现。
以下是一个简单的Python示例,展示了方法重写的基本用法:
7.2 内建函数重写
-
__abs__
abs(obj) 函数调用 -
__len__
len(obj) 函数调用 -
__reversed__
reversed(obj) 函数调用 -
__round__
round(obj) 函数调用 -
内建函数 重写示例
7.3运算符重载
-
运算符重载是指让自定义的类生成的对象(实例)能够使用运算符进行操作
-
运算符重载的作用
-
让自定义类的实例像内建对象一样进行运算符操作
-
让程序简洁易读
-
对自定义对象将运算符赋予新的运算规则
-
-
运算符重载说明:
-
运算符重载方法的参数已经有固定的含义,不建议改变原有的意义
-
- 算术运算符重载示例
8.super函数
在Python中,super()
函数是用于调用父类(超类)的一个方法。它常用于多继承的环境中,以确保每个父类都被正确地初始化,并且允许子类扩展或重写父类的方法。super()
解决了直接调用父类方法时可能遇到的名称解析问题,特别是在复杂的继承链中。
8.1基本用法
当在子类中调用super()
时,它会返回当前类的父类的一个临时对象,允许你调用该父类的方法。这通常用于__init__
方法来确保父类被正确初始化。
8.2多继承中的用法
在多继承的情况下,super()
函数按照方法解析顺序(MRO,Method Resolution Order)来调用父类的方法。MRO是一个定义了在调用一个方法时应该搜索哪个类的顺序的算法。
8.3注意事项
总之,super()
是Python中一个非常有用的特性,它简化了在继承环境中对父类方法的调用,并帮助避免了由于直接调用父类方法而可能导致的错误。