面向对象程序设计
面向过程和面向对象
面向过程
分析出问题的解决步骤,解决程序代码一一实现的过程
程序=数据结构+算法
面向对象
分析出问题中存在的对象,用代码定义对象的属性和行为,从而实现编程目的
程序=对象+行为
类和对象
类
定义:类是一个抽象的概念,它是具有相同属性和行为的对象的统称。
类创建格式
class类名(父类名):
#类属性
属性名=属性值
#初始化方法
def_ _ init_ _(self.形参列表):
#实例属性
delf.实例属性名=形参
#构造方法
def _ _new__(cls,形参列表):
cls.类属性 = 形参
return 父类.__new__(cls)
#字符串方法
def__str__(self):
return "字符串"
#析构方法
def__del__(self):
print("字符串")
#实例方法
del 方法名 (self,形参列表):
方法体
#类方法
@classmethod
def 方法名(cls,形参列表):
方法体
#静态方法
@starticmethod
def 方法名(形参列表):
方法体
对象
定义:客观存在的事务,由事物特征和功能组成
创建对象格式
对象名=类名(实参列表)
对象调用类的属性和方法
调用属性:对象名.属性
调用方法:对象名。方法名(实参列表)
特殊的父类方法
初始化方法__init__(self)
初始化实例属性,在类对象的创建中会自动调用,当不起重写父类的初始化方法时,系统会自动调用无参的初始化方法
构造方法__new__(cls)
重新构造类实例,通常它用于创造不可变类
1.默认参数为cls,指向类实例
2.构造方法中必须使用return返回父类的构造方法
3.构造方法中的形参必须与初始化方法中的形参一致
4.当对象创建时,先执行构造函数,然后执行初始化方法
字符串方法__str__(self)
当使用print()打印对象名时,可以重写该方法实现不同的输出内容
析构方法__del__(self)
用于删除对象从而释放该类在内存中的空间,在对象定义之后可通过‘del 对象名’的方式删除该对象,同时自动调用该方法
类体中方法总类
实例方法
定义
def 实例方法名(self,形参列表):
方法体
方法体中可以通过self。实例属性名来调用实例属性,也可以通过类名.类属性调用类属性
调用
使用对象名调用该方法
类方法
定义格式
@classmethod
def 类方法名(cls,形参列表):
方法体
方法体中只能通过cls.类属性名来调用,不能调用实例属性
调用
使用对象名和类名调用该方法
静态方法
定义格式
@starticmethod
def 静态方法名(形参列表):
方法体
方法体中既不能调用类属性也不能调用实例属性
调用
使用对象名和类名调用该方法
特征
封装
定义
将类体中的属性、行为、或行为的细节隐藏起来的过程
步骤
1.将封装的属性或行为私有化
2.生成get和set方法便于外部程序的调用
特殊变量
全局变量
由大写字母组成,可以由本类及子类和外部程序调用
保护变量
由_小写字母,可以由本类及子类访问
私有变量
由_ _小写字母,只能由本类访问,不能由子类访问
系统变量
由_ _ 小写字母_ _ 组成,由系统定义的属性
继承
定义
为了实现代码的拓展功能,可以在类的基础上定义它的子类,作为子类可以继承父类的公有属性和方法,也可以定义子类的属性和方法
分类
单继承
class 子类名(父类名):
#初始化方法
def __init__(self,父类的形参,子类的形参):
super() __init__(父类的形参)
多继承
class 子类名(父类1,父类2,......):
#初始化方法
def__init__(self,父类1形参,父类2形参,子类的形参):
父类1.__init__(self,父类的形参)
父类2.__init__(self,父类的形参)
说明
1.子类可以继承父类的初始化方法,公有属性和公有方法,不能继承私有属性和私有方法,子类可以定义自己的属性和方法
2.子类继承父类的属性和方法,也可以重写父类的方法
多态
定义
当子类使用不同实例调用相同方法时,程序执行的结果相同。
示例
# 类的多态
# 不同的子类对象,当调用相同的父类方法时产生不同的执行效果
class Animal (object):
def __init__(self,name,food):
self.name = name
self.food = food
def eat(self):
print("饲养员给%s喂%s。"%(self.name,self.food))
class Monkey(Animal):
def __init__(self,name,food):
super().__init__(name,food)
class Horse(Animal):
def __init__(self,name,food):
super().__init__(name,food)
class Rabbit(Animal):
def __init__(self,name,food):
super().__init__(name,food)
# 饲养员类
class Breeder(object):
def feedAnimal(self,n): # n表示的是不同动物对象
n.eat()
# 创建对象
bd = Breeder()
hz = Monkey("猴子","香蕉")
ma = Horse("马","甘草")
tz = Rabbit("兔子","萝卜")
bd.feedAnimal(hz)
bd.feedAnimal(ma)
bd.feedAnimal(tz)
# 饲养员类
class Breeder(object):
def feedAnimal(self,n): # n表示的是不同动物对象
n.eat()
说明:多态的体现,当n传入不同的对象名时,n调用相同方法eat()产生的程序结果不同