python面向对象

[toc]

两种编程思想

面向过程和面向对象,面向过程类似于做一件事都面面俱到,把所有的步骤都按顺序写出来,进行操作,比较贴近机器的运行过程,比如c语言,而面向对象就是按着人的思考方式来,交给不同的类,这些类就负责不同的任务,程序依靠不同的对象完成一件事,比如java,一切皆对象

面向对象的特征

封装:提高程序的安全性

继承:提高代码的复用性

多态:提高程序的可扩展性和可维护性

python中创建类

语法

1
2
class Student:
pass

以前用java时,他的类都是用{}括起来的,python中没有花括号,他靠类的缩进来表示类的结束

类中有属性和方法,方法又可分为实例方法,静态方法和类方法

初始化方法

1
2
3
def __init__(self, name, age):
self.name=name
self.age=age

初始只运行一次,相当于c++的构造函数,初始化传参用

实例方法

1
2
def fun(self):
pass

实例方法至少有一个参数,默认为“self”(也可以是其他的),若有其他参数,可以跟在该参数后面

可以通过实例对象调用,不用手动传递实例参数,编译器自动把实例加载到实例参数

可以通过类名称调用,然后手动传递实例参数

调用实例方法时会向它的第一个参数传递实例对象。

静态方法

1
2
3
@staticmethod
def method():
pass

@staticmethod修饰,方法中没有参数,可以用类名称调用,也可以用对象调用

类方法

1
2
3
@classmethod
def cl(cls):
pass

@classmethod修饰,类属性的值,不随实例属性的变化而变化

类属性的值,不随实例属性的变化而变化

调用方法

对象名.方法名()

类名.方法名(类的对象)–>实际上就是方法定义处的self

封装

封装相当于黑盒,只有输入和输出,程序不希望让内部程序可见

当一个属性不希望在类的外部被使用,可以给属性加上两个下划线__

继承

语法

1
2
class 子类类名(父类1,父类2..):
pass

Python支持多继承

定义子类时,必须在其构造函数中调用父类的构造函数

例子

1
2
3
4
5
6
7
8
9
class Person(object): #Person继承object类
def _ init__(self, name,age):
self.name=name
self.age=age

class Student(Person):
def __init__(self, name,age,stu_no):
super().__init__ (name,age)
self.stu_no=stu_no

如果子类对继承自父类的某个属性或方法不同,可以在子类中对其方法进行重写

所有类都默认继承object类,因此所有类都有object类的属性和方法

dir()可以查看指定对象所有属性

__str(self)__方法,返回一个对于“对象的描述”,可以重写他的描述

多态

在运行时根据引用对象类型,动态决定调用哪个对象中的方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class A(object):
def a(self):
print("a方法")
class B (A):
def a(self):
print("b方法")
class C(A):
def a(self):
print("c方法")
class P(object):
def a(self):
print("p方法")
def fun(A):
A.a()
fun(A())
fun(B())
fun(C())
fun(P())
#输出
# a方法
# b方法
# c方法
# p方法

类的浅拷贝与深拷贝

浅拷贝

一般都是浅拷贝,拷贝时,对象包含的子对象内容不拷贝

深拷贝

使用copy模块的deepcopy函数,递归拷贝对象中包含的子对象