第八节 课时105-123

方法没有重载、方法的动态性、私有属性和私有方法、面向对象进阶

  1. 方法没有重载:
    Python中,方法的参数没有申明类型(调用时确定参数的类型),参数的数量也可以有可变参数控制,因此,Python中没是没有方法的重载的。定义一个方法既可以有多种调用方式,相当于实现了其他语言中的方法的重载。

  2. 方法的动态性:
    Python是动态语言,可以动态的为类添加新的方法,或者动态的修改类的已有方法。

  3. 私有属性和私有方法(实现封装)
    Python对于类的成员没有严格的访问控制限制,这与其它面向对象语言有区别。关于私有属性和私有方法有如下要点:
    1.通常约定,两个下划线开头的属性是私有的(private)。其他为公共的(public)。
    2.类内部可以访问私有属性(方法)
    3.类外部不能直接访问私有属性(方法)
    4.类外部可以通过“_类名_私有属性(方法)”访问私有属性。

面向对象进阶

面向对象的三大特征:封装(隐藏)、继承、多态

  1. 继承:
    继承是面向对象的重要特征,也是实现“代码复用”的重要手段。如果一个心累继承自一个设计好的类,就直接具备了已有的特征,就大大降低了工作的难度。已有的类,称为“父类或者基类”,新的类,称为“之类或者派生类”。

    Python支持多重继承,一个子类可以继承多个父类。
    语法格:
    class 之类类名(父类1[,父类2,…])
    类体
    如果在类定于中没有指定父类,这默认父类是object类。也就是说,object是所有类的父类,里面定义一些所有类共有的默认实现,比如:new()。
    1.1 类成员的继承和重写
    成员继承:子类继承父类除构造方法之外的所有成员
    方法重写:子类可以重新定义父类中的方法,这样就会覆盖父类的方法,也称为“重写”。

通过类方法mro()或者_mro_可以输出这个类的继承层次结构。

1.2 object根类
object根类是所有类的父类,一次所有的类都有object的属性和方法。我们可以使用内置函数dir()看到指定对象所有的属性。

1.3 重写__str__()方法
object有一个__str__()方法,用于返回一个对于“对象的描述”,对应于内置函数str()经常用于print()方法,帮助我们查看对象的信息。str()可以重写。

1.4 多重继承
Python 支持多重继承,一个子类可以有多个“直接父类”。这样,就具备了“多个父类”的特点。但是由于会被“类的整体层次”搞的异常复杂,尽量避免使用。

1.5 MRO()
Python支持多继承,如果父类中有相同名字的方法,在子类没有指定父类名时,解释器将“从左向右”按顺序搜索。

1.6 super()获得父类定义
在子类中,如果想要获得父类的方法时,可以通过super()获得。

  1. 多态
    多态(polymorphism)是指用同一个方法调用由于对象不同可能会产生不同的行为。
    应注意:多态是方法的多态,属性没有多态;多态的存在有2个必要条件:继承、方法重写。

    2.1 特殊方法和运算符重载
    Python的运算符实际上是通过调用对象的特殊方法实现的。例如:

    a = 20
    b = 30
    c = a+b
    d = a.add(b)
    print(“c=”,c)
    print(“d=”,d)

    c= 50
    d= 50

    2.2 特殊属性
    Python对象中包含了很多双下划线开始和结束的属性,这些属性是特殊属性,有特殊用法。

    2.3 对象的浅拷贝和深拷贝
    变量的赋值操作:只是形成两个变量,实际还是指向同一个对象;
    浅拷贝:浅拷贝时,对象包含的子对象内容不拷贝。因此,源对象和拷贝对象会引用同一个子对象。python拷贝一般都是浅拷贝。
    深拷贝:使用copy模块的deepcopy函数,递归拷贝对象中包含的子对象。对源对象和拷贝对象所有的子对象也不同 。

2.4 组合
“is-a”关系,可以使用“继承”。实现子类拥有的父类的方法和属性;
“has-a”关系,可以使用“组合”,也能实现一个类拥有另一个类的方法和属性。

上一篇:题解 SP212 WATER - Water among Cubes


下一篇:模拟52 考试总结