class定义一个类,
面向对象开发有三大特征:
封装、继承、多态
1. 封装
根据职责将属性和方法 封装到一个抽象的类中。
- 封装是定义类的准则。
2. 继承
实现代码的重用, 相同的代码不需要重复的编写。
- 设计类的技巧;
- 子类继承父类所有属性和方法,然后还可针对自己特有的需求,添加或改写特定的属性和方法(其实这里就是多态);
3. 多态
不同的子类对象,调用相同的父类方法,产生不同的执行结果。
- 多态可以增加代码的灵活度
- 以继承和重写父类方法为前提
- 是调用方法的技巧,不会影响到类的内部设计
类的属性
类中的属性分为:
- 实例属性:类的实例方法中定义的self.变量名
- 类属性:class下面直接定义的变量,用于记录与这个类有关的的特征,用[类名.类属性名]来访问。
类的方法
类中的方法分为:
- 实例方法:class下面的普通方法,执行类的功能,方法名后的括号中第一个参数为self
- 类方法:class下面@classmethod开头的方法,是针对类定义的方法,方法名后的括号中第一个参数为cls。在类方法中用[cls.xx]可以直接访问类属性或调用其它的类方法,用 [类名.类方法名] 来调用这个类方法。补充,也可以像实例方法那样,用[实例.类方法名]来调用类方法。
- 静态方法:class下面@staticmethod开头的方法,如果一个方法既不需要访问类的实例属性,也不需要访问类的类属性,则可以定义该方法为staticmethod。由于既不需要访问实例属性,也不需要访问类属性,所以方法参数中不需要写self或者cls。调用静态方法同调用类方法:**[类名.类方法名] **,且不需要对类创建一个对象即可调用静态方法。
python中类方法的公有(public)私有(private)
参考 bonelee的博客
默认情况下,Python中的成员函数和成员变量都是公开的(public),在python中没有类似public,private等关键词来修饰成员函数和成员变量。
在python中定义私有变量只需要在变量名或函数名前加上 “__” 两个下划线,那么这个函数或变量就是私有的了。
在内部,python使用一种 name mangling 技术,将 “__membername” 替换成 “_classname__membername” ,也就是说,类的内部定义中, 所有以双下划线开始的名字都被 “翻译” 成 前面加上单下划线和类名 的形式。
例如:为了保证不能在class之外访问私有变量,Python会在类的内部自动的把我们定义的__spam私有变量的名字替换成为 _classname__spam (注意,classname前面是一个下划线,spam前是两个下划线),因此,用户在外部访问__spam的时候就会提示找不到相应的变量。 python中的私有变量和私有方法仍然是可以访问的;访问方法如下:
- 私有变量:实例._类名__变量名
- 私有方法:实例._类名__方法名()
其实,Python并没有真正的私有化支持,但可用下划线得到伪私有。 尽量避免定义以下划线开头的变量!
(1)_xxx "单下划线 " 开始的成员变量叫做 保护变量 ,意思是只有类实例和子类实例能访问到这些变量,需通过类提供的接口进行访问;与普通类方法不同的是,保护变量不能用’from module import *'导入
(2)__xxx 类中的 私有变量 /方法名 (Python的函数也是对象,所以成员方法称为成员变量也行得通。),
" 双下划线 " 开始的是私有成员,意思是只有类对象自己能访问,连子类对象也不能访问到这个数据。
(3)__xxx__ 系统定义名字 ,前后均有一个“双下划线” 代表python里特殊方法专用的标识,如 __init__()代表类的构造函数。
单例模式与__new__()方法
设计模式是前人工作的总结和提炼,通常被人们广泛流传的设计模式都是针对某一特定问题的成熟的解决方案。
使用设计模式是为了可重用代码,让代码更容易被人理解,更可靠。
单例设计模式的目的:让类创建的对象,在系统中只有唯一的一个实例,每次执行类的实例化,返回的对象内存地址是相同的。
应用场景:音乐播放类、回收站类、打印机类…
python中的class类进行实例化的时候有两步:
- 给对象分配空间,返回对象内存地址即引用:new()方法
- 执行初始化方法,定义实例的属性:init()方法