面向对象
在面向对象程序设计中,把数据以及处理数据的方法封装在一起,组成一个整体(对象)
类和对象
类是一种对象模板和数据类型,它定义了对象的属性(数据),并提供用于初始化对象的初始化程序和操作这些属性的方法
对象是类的一个实例,使用构造方法来创建一个对象,使用圆点运算符(.)通过引用方法和变量来访问对象的成员
创建一个
Students
对象s1
:s1 = Students('31700001','zjuzhang')
创建一个字符串对象
s
:s = 'adghdkjas'
对象和实例经常可以互换的
类:字符串,列表,字典,整形......
对象:
s1,s2
面向对象三个特点
类的封装
类的封装:把有些变量数据封装起来,使通过方法来访问,不允许对象访问,将数据和数据的操作组合起来,类是一个不可分割的独立单位
python
中类的成员包括变量(数据,属性)和方法(函数)
类和对象的变量
类的变量:是一个类的全局变量,可以给该类的所有对象(实例)使用,当某个对象对类的变量做了改动时,这个改动会反映到所有实例上
类变量:是在类中所有方法之外进行定义的,如:
price = 1000
对象的变量:不同的变量调用该变量,其值改变后互不影响,是类的每个对象/实例拥有的
实例变量:一般是指在构造方法
__init__()
中定义的,定义和使用时需要以self
作为前缀,如self.color = red
类的方法
类的方法:在类的内部可以使用def
关键字定义一个方法,类的方法必须包含参数self
,且作为第一个参数
构造方法__init__()
__init__
方法:一个类只能有一个__init__
方法,用于初始化类及其变量
私有方法是在类的内部使用的,两个下划线开头,不能在类的外部调用,只能在内部调用
私有成员与公有成员:
_xxx
:受保护成员,不能用form module import *
导入__xxx__
:系统定义的特殊成员__xxx
:私有成员,只有类内自己能访问,不能使用对象直接访问到这个成员
其他形式名称的成员,都是公有成员,公有成员在类体内和类体外都可以直接访问
类的继承
类的继承:从一个通用类(父类),扩展更多特定的类(子类)
私有成员不能继承
# 父类
class Car():
price = 300000 # 定义类变量
def __init__(self, name):
self.name = name # 定义实例变量
self.color = ""
def setColor(self, color): # 定义方法
self.color = color
class ECar(Car): # 子类ECar继承父类Car
def __init__(self, name):
super().__int__(name) # 初始化父类的属性,使用父类的构造方法
self.battery_size = 300
类的多态
类的多态:子类的对象可以传递给需要父类类型的参数
类和对象的创建和使用
python
使用class
关键字来定义类,class
关键字之后一个空格,然后是类的名字,再然后是一个冒号,最后换行并定义类的内部实现
class Classname:
initializer # 初始化
methjods # 定义方法
isinstance()
:测试一个对象是否为某个类的实例isinstance(s1, Student)
:判断对象s1
是不是Student
类的实例
访问对象:
通过对象名.成员名的形式访问对象的数据成员或方法成员,如s1.name
class Fruit:
price=0
def __init__(self):
self.color = 'Red' # 定义和设置私有属性color
self.city = 'Kunming' # 定义和设置私有属性city
@ staticmethod
def getPrice(): # 定义静态方法getPrice
return Fruit.price
@ staticmethod
def setPrice(p): # 定义静态方法setPrice
Fruit.price = p
@ staticmethod
标识的方法是静态方法,静态方法属于类,静态方法通过类名调用,静态方法中不能访问实例属性,只能访问属于类属性
变量值的修改:
直接通过对象进行修改:
pythons4 = Student("lei", "15415616") s4.gpa = 3.8 # 直接通过对象进行修改
通过方法进行设置(常用)
pythondef setGpa(self, gpa): self.gpa = gpa s5.setGpa(3.6)
定义makeStudent
方法,用于创建对象
def makeStudent(infoStr):
name,num,credits,qpoints = infoStr.split("\t")
return StudentGPA(name,num,credits,qpoints)