文章目录
面向对象/过程
面向对象
谁来做,注重结果
三大特性:封装、继承、多态
封装
属性和方法封装在类中
继承
代码重用,相同代码不需要重复编写,减少冗余
子类(派生类)可以拥有父类(基类)的所有方法和属性
# 类A的父类是object类,object类是python中的原始类
class A:
pass
# 类B继承类A
class B(A):
pass
方法调用的顺序是子类——父类——object
,若object中没有则代码报错
重写
在子类中定义和父类同名的方法
当父类中的方法不能满足子类对象需求时进行重写,重写后的方法只会调用子类中的方法,不再调用父类中的方法
- 覆盖,完全重写,无需父类中的内容
- 扩展,依旧调用父类中的内容,添加一些新的内容
多态
不同对象调用相同方法会产生不同的结果
面向过程
怎么做,注重过程
类和对象
开始声明类时,将创建一个新的命名空间,作为局部作用域,类声明完成时,将创建一个类对象
实例对象,通过类创建的对象
类对象,就是类,是python解释器在执行代码的过程中创建的
类
抽象概念,泛指具有相同或相似特征和行为的事物
- 类名:大驼峰命名法
- 属性:事物的特征
- 方法:事物的行为
对象
具体概念,特指某一个事物
代码设计
定义类
使用class
关键字定义类,类中的函数即为方法
class name:
def func(self):
pass
self
是普通形参,但调用时没有传递实参值。在执行代码时自动将调用这个方法的对象传递给self,因为self的本质是对象。如下图示例
创建对象 / 类的实例化
使用类名()
创建对象,要通过变量名保存对象地址,变量=类名()
添加属性
类内部,self.属性名=属性值
,在类中添加属性通常写在__int__()中
类外部,对象.属性名=属性值
,一般不使用
获取属性
类内部,self.属性名
类外部,对象.属性名
调用方法
使用对象.方法名()
调用方法
实例方法,类中定义的方法,参数一般为self,即实例对象
类方法,方法名上方使用@classmethod
装饰器的方法,参数一般为cls,即类对象
静态方法,方法名上方使用@staticmethod
装饰器的方法,一般没有参数,方法中不需要使用实例属性,也不需要使用类属性
魔法方法
双前导双末尾下划线的方法,在满足条件时会自动调用,如__init__()
__init__()
构造方法
创建对象之后自动调用
- 给对象添加属性
- 创建对象必须执行的代码,用于初始化
- 如果有self以外的形参,要注意形参传递
__str__()
使用print(对象)打印对象时自动调用
- 关于对象的属性信息
- 若类中没有定义该方法,print(对象)是默认输出对象的内存地址
- 必须返回字符串
__del__()
析构方法
删除对象时自动调用
- 代码执行结束,所有对象都会被删除
- 使用
del 对象
可以删除对象,若一个对象存在多个引用,则需要删除所有引用才可彻底删除对象
class Person:
def __init__(self,name,weight):
self.name=name
self.weight=weight
def __str__(self):
return f'{self.name}的体重是{self.weight}kg'
def __del__(self):
print('代码结束,删除对象')
def run(self):
self.weight=self.weight-0.5
def eat(self):
self.weight=self.weight+1
a=Person('小明',75)
print(a)
a.run()
print(a)
a.eat()
print(a)
dir(对象)
查看对象的所有方法,包括魔法方法和自定义方法
权限
python中定义的属性和方法,可以添加访问控制权限
公有
- 直接书写的属性和方法
- 公有的属性和方法,可以在任意地方访问和使用
私有
- 类内部的属性名或方法名前带
__
为私有(类外部用__的话并不是添加私有) - 私有的属性和方法,只能在当前类的内部使用