python面向对象
[toc]
两种编程思想
面向过程和面向对象,面向过程类似于做一件事都面面俱到,把所有的步骤都按顺序写出来,进行操作,比较贴近机器的运行过程,比如c语言,而面向对象就是按着人的思考方式来,交给不同的类,这些类就负责不同的任务,程序依靠不同的对象完成一件事,比如java,一切皆对象
面向对象的特征
封装:提高程序的安全性
继承:提高代码的复用性
多态:提高程序的可扩展性和可维护性
python中创建类
语法
1 | class Student: |
以前用java时,他的类都是用{}括起来的,python中没有花括号,他靠类的缩进来表示类的结束
类中有属性和方法,方法又可分为实例方法,静态方法和类方法
初始化方法
1 | def __init__(self, name, age): |
初始只运行一次,相当于c++的构造函数,初始化传参用
实例方法
1 | def fun(self): |
实例方法至少有一个参数,默认为“self”(也可以是其他的),若有其他参数,可以跟在该参数后面
可以通过实例对象调用,不用手动传递实例参数,编译器自动把实例加载到实例参数
可以通过类名称调用,然后手动传递实例参数
调用实例方法时会向它的第一个参数传递实例对象。
静态方法
1 |
|
用@staticmethod
修饰,方法中没有参数,可以用类名称调用,也可以用对象调用
类方法
1 |
|
用@classmethod
修饰,类属性的值,不随实例属性的变化而变化
类属性的值,不随实例属性的变化而变化
调用方法
对象名.方法名()
类名.方法名(类的对象)–>实际上就是方法定义处的self
封装
封装相当于黑盒,只有输入和输出,程序不希望让内部程序可见
当一个属性不希望在类的外部被使用,可以给属性加上两个下划线__
继承
语法
1 | class 子类类名(父类1,父类2..): |
Python支持多继承
定义子类时,必须在其构造函数中调用父类的构造函数
例子
1 | class Person(object): #Person继承object类 |
如果子类对继承自父类的某个属性或方法不同,可以在子类中对其方法进行重写
所有类都默认继承object类,因此所有类都有object类的属性和方法
dir()
可以查看指定对象所有属性
__str(self)__
方法,返回一个对于“对象的描述”,可以重写他的描述
多态
在运行时根据引用对象类型,动态决定调用哪个对象中的方法
1 | class A(object): |
类的浅拷贝与深拷贝
浅拷贝
一般都是浅拷贝,拷贝时,对象包含的子对象内容不拷贝
深拷贝
使用copy模块的deepcopy函数,递归拷贝对象中包含的子对象