美文网首页
py3笔记12:面向对象

py3笔记12:面向对象

作者: _百草_ | 来源:发表于2022-04-21 13:47 被阅读0次

1. 简介

image.png
基本概念:
  • 方法
  • 类变量或类属性
  • 数据成员:类变量或实例变量用于处理类及其实例对象的相关的数据
  • 方法重写
  • 局部变量
  • 实例变量
  • 继承
  • 实例化:创造类的一个实例
  • 对象

2. 类和实例

# 旧式类或经典类
class OldClass:
    pass

# 新式类
class NewClass(object):
    pass
# py2 VS py3
新式类继承了object 类,在 Python2 中,我们定义类的时候最好定义新式类,
当然在 Python3 中不存在这个问题了,因为 Python3 中所有类都是新式类。
- 新式类,按广度优先的方式查下去
- 旧式类,按深度优先的方式查下去
image.png
image.png
  • __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. 数据封装

封装:将抽象得到的数据和行为相结合,形成一个有机整体


image.png

4. 访问权限

image.png
image.png
image.png

5. 继承与多态

5.1 继承

子类,又称派生类derived class
父类,又称基类base class


继承
  • 优点:提高代码的复用
  • 弊端:任何一点变化都需要重新定义一个类,很容易引起爆炸式增长,产生一大堆细微不同的子类。
    ==>多用组合少用继承
  • 类.mro()查看类继承顺序
    注: MRO 就是类的方法解析顺序表, 其实也就是继承父类方法时的顺序表。
print(C.mro())
# 输出:
[<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class 'object'>]
  • 调用父类的构造方法
    子类中需要父类的构造方法时,显式调用父类的构造方法,或不重写父类的构造方法
  1. 子类不重写__init__,则实例化子类时,会自动调用父类的__init__
    不重写父类的构造方法,自动继承
  2. 子类重写 __init__
    子类重写__init__
  3. 子类重写__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 多态

不同类型的变量进行相同的操作,会根据对象或类类型的不同而表现不同的行为
如,+:整数进行操作,返回和;字符串进行操作,返回拼接字符串


多态
多态2

5.3 动态语言

静态语言 VS 动态语言

6. 获取对象信息

type()
types
isinstance()
dir()
image.png

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

7.1 实例属性和类属性

image.png

7.2 方法的装饰器

  • @classmethod 类方法,类名可以直接调用


    image.png
  • @property 可以向访问属性一样调用的方法


    property
ins = Add(1, 2)
print(ins.get_age)  # 像访问属性一样调用方法(注意看get_age是没有括号的)

8. 运算符重载

运算符重载

9. 十大原则

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

注:

  1. 继承和多态
  2. Python3面向对象
  3. 草根学Python:面向对象
  4. python3继承,多继承
  5. Python 3.7之继承
  6. 为什么要多用组合少用继承?

相关文章

  • py3笔记12:面向对象

    1. 简介 类 方法 类变量或类属性 数据成员:类变量或实例变量用于处理类及其实例对象的相关的数据 方法重写 局部...

  • python面向对象学习笔记-01

    学习笔记 # 0,OOP-Python面向对象 - Python的面向对象 - 面向对象编程 - 基础 -...

  • (17.06.06)面向对象、创建一个类、devicemotio

    笔记 什么是面向对象?    面向对象是一种编程思想:OOP    面向过程    面向对象    面向数据 作用...

  • Python学习-面向对象

    查看所有Python相关学习笔记 面向对象 面向对象知识点汇总: 面向对象静态属性实例属性(self)静态方法(@...

  • JavaScript面向对象学习笔记

    @(JS技巧)[面向对象] JavaScript面向对象学习笔记 封装 Javascript是一种基于对象(obj...

  • 第7天,面向对象

    @(python)[笔记] 目录 前言 在python中,一切皆对象面向对象的程序设计的核心就是对象;面向对象的程...

  • “老奶奶”的python学习笔记(12)

    知识体系 第12关:面向对象编程 知识点 面向对象编程(Object Oriented Programming) ...

  • 12面向对象

    迭代器和生成器 生成器:a.可以看成是一个可以存储多个数据的容器。需要里面的数据的时候就生成一个,里面的数据只能从...

  • 面向对象笔记

    public:公共的,所以类都可以用。 private:如果是private变量,可以放本类方法里,外部调用方法,...

  • 面向对象的基本特性

    算是读书笔记吧 极客时间--设计模式之美 面向对象 面向对象编程 -- OOP(Object Oriented P...

网友评论

      本文标题:py3笔记12:面向对象

      本文链接:https://www.haomeiwen.com/subject/njalrrtx.html