面向对象进阶

继承

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

语法格式
Python 支持多重继承,一个子类可以继承多个父类。继承的语法格式如下:

 class 子类类名(父类 1[,父类 2...]):
  	类体 

如果在类定义中没有指定父类,则默认父类是 object 类。也就是说,object 是所有类的父 类,里面定义了一些所有类共有的默认实现,比如:new()。 定义子类时,必须在其构造函数中调用父类的构造函数。调用格式如下: 父类名.init(self, 参数列表)

class Person: 
	def __init__(self,name,age): 
		self.name = name
		self.__age = age
	
	def say_age(self): 
		print(self.name,"的年龄是:",self.__age)


class Student(Person): 
	def __init__(self,name,age,score): 
		self.score = score 
		Person.__init__(self,name,age) #构造函数中包含调用父类构 造函数。根据需要,不是必须。 子类并不会自动调用父类的__init__(),我 们必须显式的调用它。 

s1 = Student("张三",15,85) 
s1.say_age() 
print(dir(s1)) 

运行结果:

张三 的年龄是: 15 ['_Person__age', '__class__', '__delattr__', '__dict__',
'__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__',
'__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__',
'__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__',
'name', 'say_age', 'score'] 

类成员的继承和重写

  1. 成员继承:子类继承了父类除构造方法之外的所有成员。
  2. 方法重写:子类可以重新定义父类中的方法,这样就会覆盖父类的方法,也称为“重写

object 根类
object 类是所有类的父类,因此所有的类都有 object 类的属性和方法。
dir()查看对象属性
重写__str__()方法
object 有一个__str__()方法,用于返回一个对于“对象的描述”,对应于内置函数 str() 经常用于 print()方法,帮助我们查看对象的信息。str()可以重写。
super()获得父类定义 在子类中,如果想要获得父类的方法时,我们可以通过 super()来做。

多态

多态(polymorphism)是指同一个方法调用由于对象不同可能会产生不同的行为。在现实 生活中,我们有很多例子。比如:同样是调用人的休息方法,张三的休息是睡觉,李四的休 息是玩游戏,高淇老师是敲代码。同样是吃饭的方法,中国人用筷子吃饭,英国人用刀叉吃 饭,印度人用手吃饭。 关于多态要注意以下 2 点: 1. 多态是方法的多态,属性没有多态。 2. 多态的存在有 2 个必要条件:继承、方法重写。

特殊方法和运算符重载

常见的特殊方法统计如下:

方法说明例子
init构造方法对象创建:p = Person()
del析构方法对象回收
repr,str打印,转换print(a)
call函数调用a()
getattr点号运算a.xxx
setattr属性赋值a.xxx = value
getitem索引运算a[key]
setitem索引赋值a[key]=value
len长度len(a)

每个运算符实际上都对应了相应的方法,统计如下:

运算符特殊方法说明
运算符+add加法
运算符-sub减法
<,<=,==lt,leeq比较运算符
>,>=,!=gt_,ge,ne比较运算符
_,^,&or,xor,and
<<,>>lshift,rshift左移、右移
*,/,%,//mul,truediv,mod,_ floordiv_乘、浮点除、模运算 (取余)、整数除
**pow指数运算

特殊属性

Python 对象中包含了很多双下划线开始和结束的属性,这些是特殊属性,有特殊用法。这 里我们列出常见的特殊属性:

特殊方法含义
obj.dict对象的属性字典
obj.class对象所属的类
class.bases类的基类元组(多继承)
class.base类的基类
class.mro类层次结构
class.subclasses()子类列表

对象的浅拷贝和深拷贝

变量的赋值操作 只是形成两个变量,实际还是指向同一个对象。 ·浅拷贝Python 拷贝一般都是浅拷贝。拷贝时,对象包含的子对象内容不拷贝。因此,源对象 和拷贝对象会引用同一个子对象。 ·深拷贝使用 copy 模块的 deepcopy 函数,递归拷贝对象中包含的子对象。源对象和拷贝对象 所有的子对象也不同。
组合“is-a”关系,我们可以使用“继承”。从而实现子类拥有的父类的方法和属性。“is-a” 关系指的是类似这样的关系:狗是动物,dog is animal。狗类就应该继承动物类。 “has-a”关系,我们可以使用“组合”,也能实现一个类拥有另一个类的方法和属性。” has-a”关系指的是这样的关系:手机拥有 CPU。 MobilePhone has a CPU。
设计模式_单例模式实现
单例模式(Singleton Pattern)的核心作用是确保一个类只有一个实例,并且提供一 个访问该实例的全局访问点。 单例模式只生成一个实例对象,减少了对系统资源的开销。当一个对象的产生需要比较 多的资源,如读取配置文件、产生其他依赖对象时,可以产生一个“单例对象”,然后永久 驻留内存中,从而极大的降低开销。

Python 文档字符串(DocStrings)

DocStrings 文档字符串是一个重要工具,用于解释文档程序,帮助你的程序文档更加简单易懂。
我们可以在函数体的第一行使用一对三个单引号 ‘’’ 或者一对三个双引号 “”" 来定义文档字符串。
你可以使用 doc(注意双下划线)调用函数中的文档字符串属性。

def function():
        ''' say something here!
        '''
        pass
 
print (function.__doc__) # 调用 doc

输出结果为:

 say something here!
posted @ 2020-02-08 19:32  阳神  阅读(107)  评论(0编辑  收藏  举报