相关概念
Python作为一门面向对象的编程语言,它跟其它的面向对象的编程语言一样也具有类的特性
- 类(class):用来描述具有相同的属性和方法的对象的集合,它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。
- 类变量:类变量在整个实例化的对象中是公用的。类变量定义在类中且在函数体之外。类变量通常不作为实例变量使用。
- 实例变量:定义在方法中的变量,只作用于当前实例的类
- 数据成员:类变量或者实例变量用于处理类及其实例对象的相关的数据
- 方法重载:如果从父类继承的方法不能满足子类,可以对其进行改写,这个过程叫方法的覆盖(override),也称为方法的重载。
- 继承:即一个派生类(derived class)继承基类(base class)的字段和方法。继承也允许把一个派生类的对象作为一个基类对象对待。例如,有这样一个设计:一个Dog类型的对象派生自Animal类,这是模拟“是一个(is-a)”关系
- 实例化:创建一个类的实例,类的具体对象。
- 方法:类中定义的函数
- 对象:通过类定义的数据结构实例。对象包括两个数据成员(类变量和实例变量)和方法
一、创建类
class ClassName:
'类的帮助信息' # 类文档字符串
class_suite # 类体
- 类的帮助信息可以通过ClassName.__doc__查看
- class_suite 由类成员,方法,数据属性组成。
- self 代表类的实例,而非类
- 类的方法与普通的函数只有一个特别的区别——它们必须有一个额外的第一个参数名称,按照惯例它的名称是self。
二、创建实例对象
要创建一个类的实例,你可以使用类的名称,并通过__init()__方法接受参数。
类名加括号就是实例化,会自动触发__init__函数的运行,可以用它来为每个实例定制自己的特征
三、成员访问
- 使用点(.)来访问对象的属性
- 可以添加、删除、修改类的属性
- Python内置类属性
- dict:类的属性(包含一个字典,由类的数据属性组成)
- doc:类的文档字符串
- name:类名
- module:类定义所在的模块(类的全名是’main.className’,如果类位于一个导入模块mymod中,那么className.__module__等于mymod)
- bases:类的所有父类构成元素(包含以所有父类组成的元组)
内置类属性调用实例如下:
- 类的销毁
同Java语言一样,Python使用了引用计数这一简单技术来追踪内存中的对象。
在Python内部记录着所有使用中的对象各有多少引用。
一个内部跟踪变量,称为一个引用计数器。
当对象被创建时,就创建了一个引用计数,当这个对象不再需要时,也就是说,这个对象的引用计数变为0时,它被垃圾回收。但是回收不时“立即”的,由解释器在适当的时机,将垃圾对象占用的内存空间回收。
析构函数__del__,__del__在对象消逝的时候被调用,当对象不再被使用时,__del__方法运行
四、类的继承
- 面向对象的编程带来的主要好处之一是代码的重用,实现这种重用的方法之一是通过继承机制。继承完全可以理解成类之间的类型和子类型关系。
- 基本格式:
class SubClassName(ParentClass1,ParenClass2...):
Optional class documentation string
class_suite
- Python与Java不同的是它还允许多重继承
一、方法重写
如果父类方法的功能不能满足你的需求,你可以在子类重写父类的方法:
五、类的属性方法
- 类的私有属性
private_attrs:两个下划线开头,声明该属性为私有,不能在类地外部被使用或直接访问。在类内部的方法中使用是self.private_attrs - 类的方法
在类的内部,使用def关键字可以为类定义一个方法,与一般函数定义不同,类方法必须包含参数self,且为第一个参数 - 单下划线、双下划线、头尾双下划线说明:
- foo:定义的是特殊方法,一般是系统定义名字,类似init()之类的
- _foo:以单下划线开头的表示是protected类型的变量,这个在Java中也有,即保护类型只能允许其本身与子类进行访问,不能用于from modele import *
- __foo:双下划线的表示的是私有类型(private)的变量,只能是允许这个类本身进行访问了。
- 类的静态方法和类方法
Python 中的实例方法由实例调用,且隐含传入的self参数为实例本身。而静态方法在类中定义,无需参数,直接由类调用。类方法由实例调用,传入的参数为类本身,通常用cls作为参数名字。本关的任务是让学习者掌握静态方法与类方法的声明与使用。
用@staticmethod、@classmethod装饰,这让我想起了javaweb开发框架的注解开发