继承
继承是面向对象程序设计的重要特征,也是实现“代码复用”的重要手段。 如果一个新类继承自一个设计好的类,就直接具备了已有类的特征,就大大降低了工作 难度。已有的类,我们称为“父类或者基类”,新的类,我们称为“子类或者派生类”。
语法格式
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']
类成员的继承和重写
- 成员继承:子类继承了父类除构造方法之外的所有成员。
- 方法重写:子类可以重新定义父类中的方法,这样就会覆盖父类的方法,也称为“重写
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,le,eq | 比较运算符 |
>,>=,!= | 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!