1. 简介

基本概念:
- 类
- 方法
- 类变量或类属性
-
数据成员
:类变量或实例变量用于处理类及其实例对象的相关的数据 - 方法重写
- 局部变量
- 实例变量
- 继承
-
实例化
:创造类的一个实例 - 对象
2. 类和实例
# 旧式类或经典类
class OldClass:
pass
# 新式类
class NewClass(object):
pass
# py2 VS py3
新式类继承了object 类,在 Python2 中,我们定义类的时候最好定义新式类,
当然在 Python3 中不存在这个问题了,因为 Python3 中所有类都是新式类。
- 新式类,按广度优先的方式查下去
- 旧式类,按深度优先的方式查下去


-
__init__
,构造方法,该方法在类实例化时会自动调用 -
self.__class__
指向类(self不是关键字,但一般使用self;cls一般代指class本身)
class Student:
def func(self):
print(self)
print(self.__class__)
s = Student()
s.func()
# 打印结果
<__main__.Student object at 0x0000023CD04CEEE0> # self
<class '__main__.Student'> # self.__class__
2.1 类的专用方法
-
__init__
:构造方法,在生成对象时调用 -
__del__
:析构函数,释放对象时使用;与构造方法相对应,类销毁时使用 -
__repr__
:打印,转换 -
__setitem__
: 按照索引赋值 -
__getitem__
: 按照索引获取值 -
__len__
: 获得长度 -
__cmp__
: 比较运算 -
__call__
: 函数调用 -
__add__
: 加运算 -
__sub__
: 减运算 -
__mul__
: 乘运算 -
__truediv__
: 除运算 -
__mod__
: 求余运算 -
__pow__
: 乘方 -
__bases__
:特殊属性,返回的是父类;Object是最顶层的类,类的老祖宗
class Add:
pass
print(Add.__bases__) # (<class 'object'>,)
# 为什么返回一个元组?==>因为元组不可变
3. 数据封装
封装:将抽象得到的数据和行为相结合,形成一个有机整体

4. 访问权限



5. 继承与多态
5.1 继承
子类,又称派生类derived class
父类,又称基类base class

- 优点:提高代码的复用
-
弊端:任何一点变化都需要重新定义一个类,很容易引起爆炸式增长,产生一大堆细微不同的子类。
==>多用组合少用继承
-
类.mro()查看类继承顺序
注:MRO
就是类的方法解析顺序表, 其实也就是继承父类方法时的顺序表。
print(C.mro())
# 输出:
[<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class 'object'>]
-
调用父类的构造方法
子类中需要父类的构造方法时,显式调用父类的构造方法,或不重写父类的构造方法
- 子类不重写
__init__
,则实例化子类时,会自动调用父类的__init__
不重写父类的构造方法,自动继承
- 子类重写
__init__
子类重写__init__
- 子类重写
__init__
时,继承父类的构造方法
方式一:父类名称.__init__(self, 参数1, 参数2……)
class Student:
# 定义构造方法
def __init__(self, name, age):
self.name = name
self.age = age
def func(self):
pass
class MiddleStudent(Student):
def __init__(self, name, age, grade):
# 调用父类的构造方法;注意这里必须要有self
Student.__init__(self, name, age)
self.grade = grade
方式二:super(子类, self).__init__(参数1,参数2……)
super()
,用于调用父类(超类)的一个方法。
用来解决多重继承问题,涉及查找顺序(MRO)、重复调用(钻石继承)等问题
直接用类名调用父类方法在单继承时没有问题
python3中,可以使用super().xxx
直接代替super(class, self).xxx
实现原理:首先找到 class的父类,然后把子类的对象转换为父类的对象
- 多继承
class DeriverClassName(Base1, Base2,Base3)
pass
#
需要注意圆括号中父类的顺序,若是父类中有相同的方法名,
而在子类使用时未指定,python从左至右搜索 即方法在子类中未找到时,从左到右查找父类中是否包含方法。
-
私有属性无法继承
image.png
5.2 多态
不同类型的变量进行相同的操作,会根据对象或类类型的不同而表现不同的行为
如,+:整数进行操作,返回和;字符串进行操作,返回拼接字符串


5.3 动态语言

6. 获取对象信息





7. 实例属性和类属性&实例方法和类方法
7.1 实例属性和类属性

7.2 方法的装饰器
-
@classmethod 类方法,类名可以直接调用
image.png
-
@property 可以向访问属性一样调用的方法
property
ins = Add(1, 2)
print(ins.get_age) # 像访问属性一样调用方法(注意看get_age是没有括号的)
8. 运算符重载

9. 十大原则
- 代码复用
- 封装变化
- 开闭原则
- 单一职责原则
- 依赖注入/依赖倒置原则
- 里氏替换原则(LSP)
- 接口隔离原则(ISP)
- 多用组合,少用继承
- 组合让测试更容易:单元测试时,mock
- 现有设计模式辅证:策略模式、装饰者模式等
- 继承不利于封装:父类改变,会影响父类
- 组合更具灵活
- 面向接口编程
- 委托原则
注:
网友评论