day18回顾:


  • 类变量(类属性)
    特列的类变量
    _slots_ 列表
    预置的类变量:
    _doc_
    _base_
    类方法(@classmethod)
    @classmethod
    def get_v(cls):
    pass
  • 静态方法 @staticmethod
    依懒于类或此类的对象来调用
  • 继承/派生
    继承可以直接使用父类的方法
    派生可以添加新的方法
  • 单继承
    class 类名(只有一个父类):
    pass
    示例:
    class A:
    def a(self):
    pass
    def b(self):
    pass
    class B(A):
    pass
  • 覆盖 override
    1.有继承
    2.子类中有同名的方法
    3.子类对象来调用同名的方法
    出现覆盖现象
  • super(类, 对象)
    super() # 等同于super(当前类, self)
    示例:
class A:
          def m(self):
             print("A.m")
      class B(A):
          def m(self):
             print("B.m")
      class C(B):
          def m(self):
             print("C.m")
      c = C()
      c.m()  # C.m
      super(C, c).m()  # B.m
      super(B, c).m()  # A.m

day19笔记:

  • 用于类的函数:
    issubclass(cls, cls_or_tuple) 判断一个类是否继承自某个类cls或tuple中的某些类中的一个类,如果是其中一个类的派生类,则返回True,否则返回False
    示例:
class A:
        pass
    class B(A):
        pass
    class C(B):
        pass
    issubclass(C, B)  # True
    issubclass(B, A)  # True

封装 enclosure

封装是指隐藏类的实现细节,让使用者不用关心类的实现细节
封装的目的是让使用者通过尽可能少的方法或属性来操作对象

  • 私有属性和方法
    python类中以双下划线(’__’) 开头,不以双下划线结尾的标识符为私有成员,私有成员只能使用方法来进行访问和修改
    以’’ 开头的属性为私有属性
    以’
    ’ 开头的方法为私有方法
  • 多态 polymorphic
  • 字面意思: 多种状态
    多态是指在有继承和派生关系的类中,调用基类对象的方法,实际能调用子类的覆盖方法的现象叫多态
  • 状态:
    静态(编译时确定的状态)
    动态(运行时确定的状态)
  • 说明:
    多态调用的方法与对象相关,不与类型相关
    python全部对象都只有"动态"没有"C++语言的"编译时状态(静态).
  • 面向对象的编程语言的特征:
    封装
    继承
    多态

多继承 multiple inheritance

多继承是指一个子类继承自两个或两个以上的父类(基类)

  • 语法:
class 类名(基类名1, 基类名2, ...):
        ...
  • 说明:
  1. 一个子类同时继承自多个父类,父类中的方法可以同时被继承下来
  2. 如果两个父类中有同名的方法,而在子类中又没有覆盖此方法,调用结果难以确定
  • 多继承的问题(缺陷):
    标识符冲突的问题,要谨慎使用多继承
  • 多继承的 MRO(Method Resolution Order)问题
    类的 mro 属性
    作用:
    用来记录类的方法的查找顺序
  • 对象转字符串函数:
  • str(obj) 通过给定的对象返回一个字符串(这个字符串通常是给人阅读的)
  • repr(obj) 返回一个附合python语法规则,且能代表此对象的表达式字符串,通常这个字符串一定是一个python表达式
    通常:

eval(repr(obj)) == obj

例:
s = “I’m a “Teacher””
s1 = str(s)
print(s1) # I’m a “Teacher”
s2 = repr(s)
print(s2) # ‘I’m a “Teacher”’

函数重写 overwrite

在自定义的类内加添相应的方法,让自定义的类创建的实例能够像内建对象一样进行内建的函数操作

对象转字符串函数的重写方法:
repr() 函数的重写方法:
def repr(self):

str() 函数的重写方法:
def str(self):

说明:

  1. str(obj) 函数先查找obj.str()方法,调用此方法并返回结果
  2. 如果obj.str()方法不存在,则调用obj.repr() 方法 并返回结果
  3. 如果obj.__repr__方法不存在,则调用object类的__repr__实例方法显示<main.xxxxobject at 0xXXXXXXXX> 格式的字符串
  • 内建函数重写:
    方法名
    _abs_ abs(obj) 函数调用
    _len_ len(obj) 函数调用
    _reversed_ reversed(obj) 函数调用
    _round_ round(obj) 函数调用
  • 数值转换函数重写
    _complex_ complex(obj) 函数调用
    _int_ int(obj)
    _float_ float(obj)
    _bool_ bool(obj)
  • 布尔测试函数重写
    方法名: bool
  • 作用:
    用于bool(obj)函数取值
    用于 if 语句的真值表达式
    用于while语句的真值表达式
  • 说明:
  1. 类内有__bool__(self) 方法,调用obj.__bool__方法取值
  2. 当不存在__bool__(self) 方法,将用obj.len() 方法的返回值求布尔值
  3. 如果不存在__len__(self) 方法,则直接返回True

迭代器(高级)

  • 什么是迭代器:
    可以用next(it) 函数取值的对象,就是迭代器
  • 迭代器协议
    迭代器协议是指对象能够使用next函数获取下一项数据,在没有下一项数据时触发一个StopIteration异常来终止迭代的约定
    迭代器协议的实现方法:
def __next__(self):
        ....
  • 什么是可迭代对象
    是指能用iter(obj) 函数返回迭代器的对象(实例)
    可迭代对象的实现方法:
    def iter(self):

    return 迭代器
  • 练习:
  1. 修改现在有学生信息管理程序,实现保护学生对象信息的安全,将score,name, age变为除该类方法外的其它函数和方法无法访问(变为私有属性进行封装)
  2. 自己写一个MyList为在,实现重写len,str,
    让MyList类型的对象变为可迭代对象
  3. 写一个类,Fibonacci实现迭代器协议,此类的对象可以作为可迭代对象生成相应的斐波那契数 1 1 2 3 5 8 13 … 如:
class Fibonacci:
 def init(self, n):
 …
 …
  1. 实现如下操作:
1.  for x in Fibonacci(5)
 print(x) # 1 1 2 3 5
 L = [x for x in Fibonacci(50)]
 print(L)
 pring(sum(Fibonacci(100)))