文档声明:
以下资料均属于本人在学习过程中产出的学习笔记,如果错误或者遗漏之处,请多多指正。并且该文档在后期会随着学习的深入不断补充完善。感谢各位的参考查看。
笔记资料仅供学习交流使用,转载请标明出处,谢谢配合。
如果存在相关知识点的遗漏,可以在评论区留言,看到后将在第一时间更新。
作者:Aliven888
1、简述
Python 从设计之初就已经是一门面向对象的语言,正因为如此,在 Python 中创建一个类和对象是很容易的。本章节我们将详细介绍 Python 的面向对象编程。
- 类(Class): 用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。
- 方法(function):类中定义的函数。
- 类变量:类变量在整个实例化的对象中是公用的。类变量定义在类中且在函数体之外。类变量通常不作为实例变量使用。
- 数据成员:类变量或者实例变量用于处理类及其实例对象的相关的数据。
- 方法重写:如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖(override),也称为方法的重写。
- 局部变量:定义在方法中的变量,只作用于当前实例的类。
- 实例变量:在类的声明中,属性是用变量来表示的,这种变量就称为实例变量,实例变量就是一个用 self 修饰的变量。
- 继承:即一个派生类(derived class)继承基类(base class)的字段和方法。继承也允许把一个派生类的对象作为一个基类对象对待。例如,有这样一个设计:一个Dog类型的对象派生自Animal类,这是模拟"是一个(is-a)"关系(例图,Dog是一个Animal)。
- 实例化:创建一个类的实例,类的具体对象。
- 对象:通过类定义的数据结构实例。对象包括两个数据成员(类变量和实例变量)和方法。
和其它编程语言相比,Python 在尽可能不增加新的语法和语义的情况下加入了类机制。
Python 中的类提供了面向对象编程的所有基本功能:类的继承机制允许多个基类,派生类可以覆盖基类中的任何方法,方法中可以调用基类中的同名方法。
对象可以包含任意数量和类型的数据。
2、类的定义
格式
类的定义由关键词 class 控制,在类名后面需要添加冒号(":")。
# 创建类
class className:
# 成员函数(行为方法)
def __init__(self): # 构造函数,系统默认的,
print('__init__')
def __init__(self, param): # 构造函数也可以自定义
print('class self.param' %self.param)
def __del__(self): #析构函数(这里面主要用于销毁对象)
print('__del__')
# 成员变量(特征属性)
param = 0;
# 定义对象
x = className()
x.__init__() # 访问成员函数
x.__init__(1) # 访问自定义构造函数
x.param # 访问成员变量
3、self 是什么
self 代表类的实例,而非类。类的方法与普通的函数只有一个特别的区别——它们必须有一个额外的第一个参数名称, 按照惯例它的名称是 self。其作用类似于C/C++中的 this。
#!/usr/bin/python3
# -*- coding: utf-8 -*-
class Aliven: # 在 python 中,类名一般大写字母开头
# 成员函数
def __init__(self, name, age): # 重写构造方法
self.name = name;
self.age = age;
def printName(self):
print('my name is %s' % self.name) # 输出打印
def printAge(self):
print('my age is {0}'.format(self.age)) # 格式化打印
# 成员变量
name = ''
age = 0
tt = Aliven('Aliven', 28);
tt.printName();
tt.printAge();
4、私有属性和方法
类的私有属性:
__private_attrs:两个下划线开头,声明该属性为私有,不能在类的外部被使用或直接访问。在类内部的方法中使用时 self.__private_attrs。但是类的属性并不是绝对的私有,这个其实是一种伪私有,我们用过使用 obj._ClassName__attrs 依旧是能访问类对象的。
类的方法
在类的内部,使用 def 关键字来定义一个方法,与一般函数定义不同,类方法必须包含参数 self,且为第一个参数,self 代表的是类的实例。
self 的名字并不是规定死的,也可以使用 this,但是最好还是按照约定是用 self。
类的私有方法
__private_method:两个下划线开头,声明该方法为私有方法,只能在类的内部调用 ,不能在类的外部调用。self.__private_methods。
>>> class A:
def __init__(self, num):
self.__num = num
def printNum(self): # 外部访问私有变量接口
print('num = %d'% self.__num)
__num = 100 # 成员变量私有化
>>> a = A(120)
>>> a.printNum()
num = 120
>>> a.__num # 私有化的成员变量无法直接被访问
Traceback (most recent call last):
File "<pyshell#23>", line 1, in <module>
a.__num
AttributeError: A instance has no attribute '__num'
>>> a._A__num # 通过 className 可访问私有变量
120
5、继承
Python 同样支持类的继承和多继承,如果一种语言不支持继承,类就没有什么意义。
子类中如果有与父类相同名称的方法 或者 属性,则父类中的方法 或者 属性将会被子类覆盖,关于 方法 的覆盖,在编程语言中被称为 方法重写。
格式
# 单一继承
class ChildClassName(BaseClassName):
# 子类属性、方法
# 多继承
class ChildClassName(BaseClassName1, BaseClassName2, BaseClassName3, ...):
# 子类属性、方法
方法重写:如果你的父类方法的功能不能满足你的需求,你可以在子类重写你父类的方法,实例如下:
super 函数: super 函数能够帮我们自动找到基类的方法,并且为我们传入 self 参数。其优点在于,我们不需要给出具体基类的名称,他会自动帮我们找到所有的基类以及其方法。
#!/usr/bin/python3
class Parent: # 定义父类
def myMethod(self):
print ('I am parent')
class Child(Parent): # 定义子类
def myMethod(self):
print ('I am child')
c = Child() # 子类实例
c.myMethod() # 子类调用重写方法
super(Child,c).myMethod() #用子类对象调用父类已被覆盖的方法
注意事项
- 在 Python 中不建议使用方法重载,因为 Python 中声明变量不需要类型关键词。所以在 Python 日常编程中,也不建议使用重载。