4.1 面向对象名词解释(草稿)
4.1.1 面向对象与面向过程
解决问题的两种思路
|
面向对象 |
面向过程 |
概念 |
将构成问题的事物,分解成若干个对象,把数据以及对数据的操作放在一起,作为一个相互依存的整体 比如moba游戏里每个英雄(类)有不同的技能(方法)和外形(属性),你创建了一个账号,你玩的每个英雄又是独一无二的(实例化),他们都有自己的属性和方法。 是一种代码封装的方法,将相关数据和实现函数封装到一起 |
直接将步骤分析出来,然后用函数把步骤一步一步实现,然后再依次调用 |
举例 |
把大象放冰箱 大象类: 鼻子长(属性) 能被放进冰箱(方法3) 冰箱类: 有门(属性) 门能被打开(方法1) 门能被关上(方法2) 主函数: 创建一只叫小明的大象(类的实例化) 创建一个叫小红的冰箱(类的实例化) 小红执行方法1 小明执行方法3 小红执行方法2 |
把大象装冰箱的步骤:
这里的每个步骤依次用函数实现,然后再依次调用 |
4.1.2 对象,类,实例
名词 |
对象 |
类 |
实例 |
概念 |
一切皆对象 |
抽象的模板,类似工厂生产前的模具,一类事物的统称 |
根据模板(模具)创建出来的具体对象,一类事物中的具体一个 |
具体 |
类,实例,方法,函数...都是对象 对象=属性+方法 静态属性(特性,形容词) 动态方法(能干啥,动作) |
|
杨幂是人类的一个实例,我家养的猫是动物类的一个实例 修改/增加一个对象的属性,这个类其他对象的属性值不变 |
应用 |
a = [1,2,3] print(type(a))
<class ‘list’> 列表类的实例对象 |
class 类名:(类名首字母大写) 属性1 属性2 def 方法1(self): 函数内容 属性3 def 方法2(self): 函数内容 |
实例 = 类名() |
4.1.3 函数,方法,参数,属性
名词 |
函数 |
方法 |
参数 |
属性 |
概念 |
|
|
1.形式参数:在定义函数时,函数名后面括号中的变量名称叫做“形式参数”,或者称为“形参” 2.实际参数:在调用函数时,函数名后面括号中的变量名称叫做“实际参数”,或者称为“实参” |
|
举例 |
dir(实例名): 查看实例的所有属性和方法 |
行为能力 狗会叫,还会咬人,还会吃东西 |
|
人类这个类来说 人有两个眼睛,一个鼻子,一张嘴 |
应用(定义) |
def 函数名(): 函数内容 |
class 类名:(类名首字母大写) 属性1 属性2 def 方法1(self): 函数内容 属性3 def 方法2(self): 函数内容 |
|
class 类名:(类名首字母大写) 属性1 属性2 def 方法1(self): 函数内容 属性3 def 方法2(self): 函数内容 |
应用(调用) |
函数名() |
方法的调用: 实例名.方法名() |
|
属性的调用: 实例名.属性名 |
4.1.4 类方法,静态方法
一个装饰器只管一个方法
类方法 | 静态方法 | 实例方法 | |
---|---|---|---|
定义 | 类具有的方法,大家都有的特征 | 本质上是函数 与类没有太多联系,与每个具体实例无关 | 不是装饰器修饰的,类里本身的方法 |
装饰器(声明下面的方法是什么方法) | @classmethod | @staticmethod | |
调用 | 类调用 & 实例调用 | 类调用 & 实例调用 | 实例调用(只能) |
类型 | method | function | method |
4.1.5 私有属性,私有方法,魔术方法,单下划线的方法
|
私有属性(__属性名) |
私有方法(__方法名) |
魔术方法(__方法名__) |
_方法名 |
定义 |
写在类里:不能通过对象直接访问, 不能从外部调用 不能被子类继承 可以在本类内部访问;但是要构造另一个函数来调用 |
前后都有双下划线__,如__init__ 是object自带的,指的是python内置的方法或属性 |
尽量不要乱调用 |
|
写法 |
__属性(双下划线) |
__方法(双下划线) |
|
_str(单下划线) |
意义 |
用来处理类的内部事情,不通过对象处理,起到安全作用。 |
|
|
4.1.6 封装、继承与多态
|
封装 |
继承 |
多态 |
组合 |
|
创建对象之前,通过类把相关属性和方法打包到一起,然后通过类生成相应的对象 |
|
不同的类中有同名的方法,调用方法时,根据对象的不同,实现的操作也不同, |
|
举例 |
|
class A: x = 520 def hello(self): print('你好') class B(A): pass b = B() b.x b.hello() |
同名的方法‘叫’,调用鸡的‘叫的方法’为鸡叫,调用鸭‘叫’的方法为鸭叫 |
|
|
|
覆盖:class B(A): x = 888 def hello(self): print('你好,我是b') b = B() b.x isinstance(b,B) # 判断对象是否属于某个类 isinstance(b,A) (结果都是True) issubclass(A,B) # 判断一个类是否是另一个类的子类 issubclass(B,A) # 前者false后者true |
|
|
|
|
多重继承: |
|
|