本周内容概要
目录- 面向对象前戏之人狗大战
- 两种编程思维
- 类与对象
- 动静态方法
- 面向对象之继承
- 面向对象之派生
本周内容详情
面向对象前戏之人狗大战
人狗大战>>>引出了面向对象
推导过程:
1.定义出人和狗的字典 但要创多个人或狗就会重复的编辑信息
2.将产生人和狗的字典封装成函数,并定义出人打狗或者狗咬人的动作 但没有指定就会出现人用狗的动作 狗用人的动作
3.让人只能调人的攻击动作,狗只能调狗的攻击动作(数据与功能的绑定)
总结:
将人的数据跟人的功能绑定在一起
将狗的数据跟狗的功能绑定在一起
以上得出 面向对象的核心思想:数据与功能的绑定
两种编程思想
1.面向过程编程
过程就是流程 面向过程编程就是按照固定的流程解决问题
即 按照指定的步骤依次执行 最终得到想要的结果
2.面向对象编程
对象就是 容器 里面是数据与功能的结合体(万物皆对象)
但只负责创造出人物及功能 至于后续发展如何不知道
"""
面向过程编程:相当于让你给出一个问题的具体解决方案
面向对象编程:相当于让你创造出一些事物,之后不用你管
"""
# 两者无好坏,需结合具体需求
# 如需求是注册登录 面向过程合适
# 如需求是游戏人物 面向对象更合适
类与对象
1.类与对象的概念
对象:数据与功能的结合体 对象才是核心
类:多个对象相同数据与功能的结合体 类主要是为了节省代码
2.类与对象创建
现实中一般是现有个体(对象),再有群体(类)
程序中必须先定义类,再产生对象
面向对象本质就是将数据和功能绑定在一起,为了突出面向对象编程,python专门设计了新的语法格式
2.1类的语法结构
class 类名:
对象公共的功能
对象公共的功能
1.class 是定义类的关键字
2.类名的命名和变量名一致,'首字母要大写'为了函数名区别
3.数据 变量名与数据值的绑定
功能 也叫方法 其实就是函数
2.2类的定义与调用
1.类在定义阶段就会执行类体代码,但是类的局部名称空间外界无法直接调用
2.类和对象获取内部数据的方法可以统一采用:句点符
3.类名()就会产生对象,每执行一次就会产生一个新的对象
2.3对象独有的数据
推导流程:
1.通过利用__dict__的方法来向字典添加键值对 由于代码重复
2.将添加独有数据的代码封装成函数 任何对象都可以调用给数据的函数
3.给学生对象添加独有数据的函数只有学生对象有资格调用
4.init变形
当内部有__init__时:
类名会把产生的空对象和参数一起传给__init__
然后给对象添加独有的数
5.变量名修改
2.4对象的独有的功能(实例化)
就是只能将函数放在类中 但是类中的函数又是对象公共的
定义在类中的功能 默认就是绑定给对象使用的 谁来调谁就是主人公
注意:
1.类调用功能需自己传一个参数
2.对象调用功能会自动将对象当作第一个参数传入
动静态方法
在类中定义函数有三种
1.类中直接定义函数
默认是绑定给对象的方法
1.1对象调用会自动将对象当作第一个参数传入
1.2类调用需要手动将对象当作第一个参数传入
self 用来接收对象
2.被@classmethod修饰的函数
默认是绑定给类的方法
2.1类调用会自动将类当第一个参数传入
2.2对象调用会将产生该对象的类当作第一参数传入
cls 用来接收类
3.被@staticmethod修饰的函数
会变成普通的函数 被@staticmethod修饰 也叫静态方法
注意:无论是对象还是类调用 有多少参数就传多少参数
面向对象之继承
1.继承的概念
面向对象的三大特性 :封装 继承 多态
继承 | 含义 | 目的 |
---|---|---|
现实 | 用来表示人与人之间资源的关系 | 占有别人的财产 |
编程 | 用来表示类与类之间数据的关系 | 类A拥有类B中所有数据和方法的使用权 |
2.继承的基本操作
2.1.定义类的时候类名后加括号填写其他类名,意味着可以去继承该类
2.2.当要继承多个类的时候,括号里需逗号隔开
被继承的类:#父类、基类、超类
继承类的类:#子类、派生类
3.继承的本质
对象:数据与功能的结合体
子类:多个对象相同数据和功能的结合体
父类:多个子类相同数据和功能的结合体
子类与父类的本质就是为了节省代码
继承的本质:
抽象:将多个类相同的东西抽出去形成一个新的父类
继承:让子类继承刚刚抽出去的父类
就是把相同的代码抽出来变成一个父类,其他类想用的时候就变成子类继承父类,子类可以调用父类中的资源
4.对象查找名字的顺序
4.1不继承的情况
对象自身 >>> 该对象的类
4.2 单继承的情况
对象自身 >>> 该对象的类 >>> 父类
4.3多继承的情况
1.菱形继承
广度优先(从左到右每条道不会走最后闭合的点,最后才会走)
2.非菱形继承
深度优先(从左到右每条道走完为止)
ps:print(类.mro())方法可以获取名字查找顺序
5.经典类与新式类
object中有类必备的所有功能
经典类:不继承object或其子类的类
新式类:继承了object或其子类的类
#在python2中有经典类和新式类
由于经典类中没有核心的功能所以在python3中就取消了
#在python3中只有新式类
'所有的类'默认都继承了object
今后在定义类时,如果没有要继承的父类就写继承object!目的时为了兼容python2
面向对象之派生
子类基于父类又做了扩展
可以简单理解成:想用别人的方法,又觉得别人方法不够
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
class Student(Person):
def __init__(self, name, age, play):
super().__init__(name, age) # 子类调用父类的方法
self.play = play # 自己补充的数据
obj = Student('jason', 18, 'run')
print(obj.__dict__) # {'name': 'jason', 'age': 18, 'play': 'run'}
练习:扩展列表尾部追加方法(不能追加jason)
class Mylist(list):
def append(self, v1):
if v1 == 'jason':
print('不能追加jason')
return
super().append(v1)
obj = Mylist()
print(obj, type(obj)) # [] <class '__main__.Mylist'>
obj.append(1)
print(obj) # [1]
obj.append('jason')
print(obj) # 不能追加jason [1]
标签:__,功能,对象,继承,汇总,面向对象,父类
From: https://www.cnblogs.com/zjl248/p/16862574.html