0%

Python高阶加强

1.初识对象

​ 希望数据的组织可以达到简洁统一。

生活中 程序中
设计表格 设计类
打印生产表格 创建对象
填写表格 对象属性赋值

2.成员方法

​ 定义在类内部的函数称之为方法

在类中定义成员方法和定义函数基本一致,但仍有细微区别:

1
2
3
4
5
6
7
8
9
def 方法体(self,形参1,.....,形参N):
方法体
"""
可以看到,在方法定义的参数列表中,有一个:self关键字
self关键字是成员方法定义的时候,必须填写的。
它用来表示类对象自身的意思。
当我们使用类对象调用方法时,self会自动被python传入,不用传入。
在方法内部,想要方法类的成员变量,必须使用self
"""

3.类和对象

使用程序中的类,可以完美的描述现实世界的事物(属性+行为)。

为什么非要创建对象才能使用呢?

​ 类只是一种程序内的”设计图纸”,需要基于图纸生产实体(对象),才能正常工作。

面向对象的编程思想: 设计类,基于类创建对象,由对象做具体的工作。

4.构造方法

Python类可以使用: init()方法,称之为构造方法

可以实现:在创建类对象(构造类)的时候,会自动执行。

​ 在创建类对象(构造类)的时候,将传入参数自动传递给init方法使用。

不省略的话,构造方法就说赋值。

省略的话,构造方法就说先声明并且赋值。

5.其他内置方法(魔术方法)

1
__init__
1
__str__ 字符串方法

​ 用于定义对象的字符串表示,即当你使用 print() 函数或者将对象转换为字符串时,Python 会调用该方法来生成对象的字符串形式。

1
2
3
4
5
6
__str__的作用:
1.自定义对象的字符串表示:当你打印对象时,Python 默认会输出对象的内存地址(例如 <__main__.MyClass object at 0x7f9b1c3a1a30>),这对于大多数对象来说并不是很有意义。通过实现 __str__方法,你可以提供一个更具可读性、具有描述性的字符串。

2.与 print()函数结合使用:print()函数会自动调用对象的__str__方法来获取对象的字符串表示,然后将其输出到控制台。

3.用于str()函数:除了print()外,str()函数也会调用对象的__str__方法。例如,如果你使用 str(obj),Python 会返回你在__str__中定义的字符串。
1
2
3
4
5
6
7
8
9
10
11
12
13
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def __str__(self):
# 定义自定义的字符串表示
return f"Person(name={self.name}, age={self.age})"
# 创建一个 Person 对象
person = Person("Alice", 30)
# 打印对象,调用 __str__ 方法
print(person) # 输出:Person(name=Alice, age=30)
# 使用 str() 函数
print(str(person)) # 输出:Person(name=Alice, age=30)
1
__lt__ 小于符合比较方法

__lt__ 方法使得对象能够与其他对象进行小于比较(即 < 运算符)。你可以在自定义类中实现这个方法,来自定义两个对象的比较规则。比如,在比较两个对象时,你可以根据对象的某些属性来决定它们的大小关系(不使用该方法直接对两个类对象比较是不可以的)

1
2
def __lt__(self, other):
# 返回一个布尔值:True 或 False
  • self 是当前对象(左侧的对象),
  • other 是要比较的另一个对象(右侧的对象)。
  • 如果当前对象小于另一个对象,则返回 True,否则返回 False
1
2
3
4
5
6
7
8
9
10
class Student:
def __init__(self,name,age):
self.name=name
self.age=age
def __lt__(self,other):
return self.age<other.age
stu1=Student("A",11)
stu2=Student("B",13)
print(stu1<stu2) # True
print(stu1>stu2) # False
1
__le__ 小于等于比较符合方法

魔术方法:__le__可用于:<=,>=两种比较运算符上,逻辑上和lt一样。

1
__eq__ 相等比较运算符实现方法

不使用__eq__这个方法进行比较,不会报错就相当于直接比较内存地址(False)

面向对象编程是基于模板(类)去创建实体(对象),使用对象完成功能开发。面向对象包含3大主要特性:分别是封装,继承和多态。

6.封装(思想)

面向对象是将现实世界事物的属性和行为描述为程序世界的类的成员变量和成员方法。

现实世界中的事物有不公开的属性和行为,作为现实事物在程序中映射的类,也应该支持对私有不公开的属性和行为进行描述。

类中提供了私有成员的形式来支持

​ 私有成员变量:变量名以__开头(两个下划线)

​ 私有成员方法:方法名以__开头(两个下划线)

即可完成私有成员的设置

私有成员不能被类对象直接使用,但是可以被类中的其他成员去使用。

私有成员的意义:在类中提供仅供内部使用的属性和方法,而不对外开放(类对象无法使用)。

7.继承

单继承:

1
2
3
class 类名(父类名):

​ 类内容体

多继承

输出父类同名的成员属性时,谁先来的谁优先(继承)。

pass关键字它用于占位,表示“什么也不做”。通常,它用于需要语法上有内容但不希望执行任何操作的场景。

继承-复写

复写:子类继承父类的成员属性和成员方法后,如果对其不满意,那么可以进行复写

1
2
3
4
5
6
7
8
9
10
11
class Phone:
IMEI=None # 序列号
producer = "ITCAST" # 厂商
def call_by_5g(self):
print("父类的5g通话")

class MyPhone(Phone):
producer="ITHEIMA" # 复写父类属性

def call_by_5g(self): # 复写父类方法
print("子类的5g同话")

继承-调用父类的同名成员

一旦复写父类成员,那么类对象调用成员的时候,就会调用复写后的新成员,如果需要使用被复写的父类的成员,需要特殊的调用方式:

方式一 方式二
调用父类成员 使用super()调用父类成员
使用成员变量:父类名.成员变量 使用成员变量:super().成员变量
使用成员方法:父类名.成员方法(self) 使用成员方法:super().成员方法()

注意:只可以在子类内部调用父类的同名成员,子类的实体类对象调用默认是调用有子类复写的。

8.类型注解

为什么内置模块的方法可以提示类型,而我们自己定义的就不行呢。其实是因为Pycharm无法通过代码确认应传入什么类型。

类型注解:引入类型注解以方便静态检查工具,IDE等三方工具。类型注解是在代码中涉及数据交互的地方,提供数据类型的注解(显示的方式)。

类型注解只是提示性的,并非决定性的,数据类型和注解类型无法对应也不会导致错误。

主要功能:

​ 帮助第三方IDE工具(如pycharm)对代码进行类型推断,协助做代码提示

​ 帮助开发者自身对变量进行类型注释

支持:

​ 变量的类型注解

​ 函数(方法)形参列表和返回值的类型注解

变量的类型注解:

​ 注意:

  • 元组类型设置类型详细注解,需要将每一个元素都标记出来(详细)

  • 字典类型设置类型详细注解,需要2个类型,第一个是key第二个是value(详细)

通过注释进行类型注解

函数(方法)形参列表和返回值的类型注解:

形参类型注解

函数和方法的形参类型注解语法:

1
2
3
4
def 函数方法名(形参名:类型,形参名:类型,.........):
passde
def add(x:int,y:int):
return x+y

返回值类型注解

1
2
def 函数方法名(形参名:类型,形参名:类型,.........)->返回值类型:
pass

Union类型:

1
2
3
my_list=[1,2,"itcast","itheima"]
my_dict={"name":"周杰伦","age":21}
# 混合类型的类型注解如何描述

9.多态

多态:指的是多种状态,即完成某个行为时,使用不同的对象会得到不同的状态

父类做定义声明,子类做实际工作,用来获得同一行为,不同状态。

多态-应用场景二:

抽象类(接口)就好比定义一个标准