目录
3)MRO(Method Resolution Order)方法:方法解析顺序
一、引入
当前软件主流开发有两种,一种是面向对象,一种是面向过程
以洗衣服为例
面向过程:脱衣服--找盆--加水--加洗衣粉--浸泡30分钟--搓洗--拧干--倒水--加水--漂洗--拧衣服--倒水--晾衣服
面向对象:脱衣服--放入洗衣机--按开关--拿出来晾晒
二、面向对象的两个概念
1.类
类=类名+属性+方法
类别 = 类名 + 属性 + 方法
-------------------------------------------------------------------------------
人类 = 人 + 身高、年龄 + 跑、睡觉
狗类 = 狗 + 品种、毛色、性别 + 叫、跑、摇尾巴
2.对象
三、面向对象三大特性
1.封装性
1)定义类
class 类名:
方法列表
# 经典类
class Hero:
class Hero():
# 新式类
class Hero(object):
def info(self):
print('object是python里的顶级父类')
2)创建对象
对象名1 = 类名()
对象名2 = 类名()
······
3)添加和获取对象的属性
对象属性即可以在类外添加获取,也可以在类里添加和获取
4)特殊功能的函数
i)_init_() 初始化对象
# 可以直接定义, 但是后续不方便修改,使用不灵活
def _init_(self):
self.name='xxx' # 姓名
self.hp = 2600 # 生命值
self.atk = 450 # 攻击力
self.armor = 200 # 护甲值
# 所以我们使用有参数的_init_方法
def _init_(self, name, skill, hp, atk, armor):
self.name=name # 姓名
self.hp = hp # 生命值
self.atk = atk # 攻击力
self.armor=armor # 护甲值
#这样后续可以直接在调运对象的时候修改参数
ii)_str_() 显示信息
iii)_del_() 删除对象
2.继承性
指多个类之间的所属关系
基本语法:
# 父类B
class B(object):
pass
# 子类A
class A(B):
pass
- object-------->class B(object)-------->class A(B) 自动继承B中的公共属性和方法,私有不算
- 在python中,所有类默认继承object类,object是顶级类或基类,其他子类都叫派生类。
与继承相关的概念
1.单继承
多层继承中的单继承
class C(object):
def func(self):
print('C类中的func方法')
class B(C):
pass
class A(B):
# A-->B-->C 可以得出结论A--> C
pass
a = A()
a.func
私有属性封装:
私有方法封装:
在函数前加上__--两个下划线
class ATM():
def __card(self):
print('插卡')
2.多继承
3.继承方法
1)重写:
在原有父类的基础之上子类进行扩展
类的调用顺序:现在现有类中进行方法调用,如果该类中没有,就使用上一级的方法。
2)强制调用父类的方法:super()
3)MRO(Method Resolution Order)方法:方法解析顺序
print(ElectricCar._ _mro_ _)
print(ElectricCar.mro())
3.多态性
子类重写父类方法,调用不同子类对象的相同父类,产生不同的执行效果
条件:多态依赖继承(非必须);子类必须重写父类方法
过程:首先定义一个父类,可能拥有多个子类对象,当调用一个公共方法(接口)时,传递的对象不同,返回的结果不同。
好处:后期无需扩展方法,只需扩展类别即可
四、面向对象其他特性
1.类属性
把类看作一个对象,考虑该类被调用了多少次
# 一、实例属性(对象属性)
class Person():
def __init__(self,name,age):
self.name = name
self.age = age # self.name和self.age中的name和age就是实例属性
# 实例化对象
p1 = Person('Tom',23)
print(p1.name)
print(p1.age)
# 二、类属性----用于统计该类被统计多少次
class Person(object):
count = 0 # 定义类属性
def __init__(self,name,age):
self.name = name
self.age = age
Person.count += 1 # 类名.属性,相当于调用类属性
# 实例化对象
p1 = Person('Tom',23)
p2 = Person('Lily',21)
# 访问Person类中的count属性
print(f'Person类中一共实例化了{Person.count}次')
2.类方法
类理解为是一个特殊对象,有类属性和类方法
在类方法中可以直接访问类属性或者调用其他类方法。
类方法基本语法:
@classmethod
def 类方法名称(cls): # cls 代表类本身
pass
与对象方法相比:
对象方基本语法:
def 函数名称(self): # self 代表实例化对象本身
pass
通过"cls."访问类的属性;也可以通过 "cls."调用其他方法
'''
创建一个工具类,每个工具都有自己的名称
再类封装一个"show_tool_count"的类方法
输出当前类,记录个数
'''
class Tool(object):
count= 0 # 统计Tool类创建对象的个数(类属性)
def __init__(self, name):
self.name = name
Tool.count += 1 #每实例化一次Tool类,则对其进行+1操作
@classmethod # 定义一个类方法,专门用于操作类属性
def show_tool_count(cls):
print(f'当前{cls}类一共被实例化{cls.count}次')
t1 = Tool('斧头')
t2 = Tool('榔头')
Tool.show_tool_count() # 调用show_tool_count()类方法
3.静态方法
在开发时,如果在类中封装一个方法,但是:
1)既不需要访问实例属性或调用实例方法
2)也不需要访问类属性或调用类方法
class Game(object):
@staticmethod # 静态方法
def menu():
print('1.开始')
print('2.结束')
Game.menu()