方法没有重载、方法的动态性、私有属性和私有方法、面向对象进阶
-
方法没有重载:
Python中,方法的参数没有申明类型(调用时确定参数的类型),参数的数量也可以有可变参数控制,因此,Python中没是没有方法的重载的。定义一个方法既可以有多种调用方式,相当于实现了其他语言中的方法的重载。 -
方法的动态性:
Python是动态语言,可以动态的为类添加新的方法,或者动态的修改类的已有方法。 -
私有属性和私有方法(实现封装)
Python对于类的成员没有严格的访问控制限制,这与其它面向对象语言有区别。关于私有属性和私有方法有如下要点:
1.通常约定,两个下划线开头的属性是私有的(private)。其他为公共的(public)。
2.类内部可以访问私有属性(方法)
3.类外部不能直接访问私有属性(方法)
4.类外部可以通过“_类名_私有属性(方法)”访问私有属性。
面向对象进阶
面向对象的三大特征:封装(隐藏)、继承、多态
-
继承:
继承是面向对象的重要特征,也是实现“代码复用”的重要手段。如果一个心累继承自一个设计好的类,就直接具备了已有的特征,就大大降低了工作的难度。已有的类,称为“父类或者基类”,新的类,称为“之类或者派生类”。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()获得。
-
多态
多态(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= 502.2 特殊属性
Python对象中包含了很多双下划线开始和结束的属性,这些属性是特殊属性,有特殊用法。2.3 对象的浅拷贝和深拷贝
变量的赋值操作:只是形成两个变量,实际还是指向同一个对象;
浅拷贝:浅拷贝时,对象包含的子对象内容不拷贝。因此,源对象和拷贝对象会引用同一个子对象。python拷贝一般都是浅拷贝。
深拷贝:使用copy模块的deepcopy函数,递归拷贝对象中包含的子对象。对源对象和拷贝对象所有的子对象也不同 。
2.4 组合
“is-a”关系,可以使用“继承”。实现子类拥有的父类的方法和属性;
“has-a”关系,可以使用“组合”,也能实现一个类拥有另一个类的方法和属性。