面向对象程序设计
一,前言
python是一门与生俱来的面向对象的语言,可以方便的创建类与对象。
二,对象的概念
1,对象是一个抽象的概念,世间万物皆可为对象,比如人也是一个对象。
2,对象一般分为两个部分,静态部分与动态部分。
静态部分:也称属性,客观存在,不能被忽略的,比如,人的性别。
动态部分:也称行为,对象执行的动作,比如,人可以行走。
3,在python中一切都是对象。
三,类的概念
1,定义:
类是封装对象的属性与行为的载体。
比如,大雁类,具备翅膀与爪等属性,飞行,睡觉等行为,那么大雁类中的任意一个对象都有这些属性与行为。
2,面向对象程序设计的特点
封装:将属性与行为均相同的一些对象封装起来。--------类
继承:子类通过继承获得父类的属性与行为的同时,又添加了自己特有的属性与行为。
多态:通过一个父类,可以继承出许多的子类,这样的一个现象,称为多态。
四,类的定义与使用
1,定义类
class 类名:
“”“文档字符串
””“
类体
注意:1,类名一般需要大写。
2,类体可以用pass语句占位。
2,类体包含的__init_(参数列表)方法
注意:开头与结尾是双下划线,这是一种约定。
3,创建类的实例
变量名=类名(参数列表)
注意:当__init__(self),只有self参数时,参数列表可以省略。
代码:
class Pig:
"""
猪类
"""
def __init__(self):
print("我是猪类")
blackpig=Pig()
结果:
五,类体中的成员
1,成员1:变量(属性)
属性可以分为类属性与实例属性。
类属性:定义在类中,但在函数外的变量,类的所有实例都可以访问类属性。
实例属性:定义在函数内的变量,只有当前实例可以访问该实例属性。
2,成员2:函数(方法)
定义在类中,与def init()的缩进相同。
六,访问类体中的成员
1,访问类中的函数(方法):
类名.函数名(参数列表)
或
实例名.函数名(参数列表)
2,访问类中的类属性
类名.变量名
或
实例名.变量名
class Pig:
"""
猪类
"""
color='白色'
def __init__(self):
print("我是猪类")
blackpig=Pig()
print(Pig.color)
print(blackpig.color)
结果:
3,访问类中的实例属性
实例名.变量名
class Pig:
"""
猪类
"""
color='白色'
def __init__(self):
self.body="肥胖"
print("我是猪类")
blackpig=Pig()
print(Pig.color)
print(blackpig.color)
print(blackpig.body)
注意:实例属性只能被实例访问,不能通过类名访问。
七,访问限制
在python中,类体中有些属性很重要,是机密,不能被访问,但是有些属性,却又是共享值,需要被访问,所以python中采取以下方法,对访问进行限制。
方法:
在属性或方法前加上单下划线,双下划线,或首尾双下划线。
1,单下划线开头,_foo:
表示公有类型的成员,允许类本身(类名与实例名)与子类访问。
2,双下划线开头,__foo:
表示私有类型的成员,只允许类本身(类名)访问,不允许子类访问。
3,首尾双下划线,—foo—:
表示特殊方法,系统定义的方法。
八,修改属性
访问的同时,使用赋值语句。
class Pig:
"""
猪类
"""
color='白色'
def __init__(self):
self.body="肥胖"
print("我是猪类")
blackpig=Pig()
blackpig.body='瘦弱'
print(Pig.color)
print(blackpig.color)
print(blackpig.body)
结果:
九,特殊属性
使用@property(装饰器)强行将方法装饰为属性。
方法:
@property
def 函数名(参数列表):
函数体
1,举例
class Pig:
"""
猪类
"""
color='白色'
def __init__(self):
self.body="肥胖"
print("我是猪类")
@property
def pp(self):
print('我是一头大肥猪')
return 'pigpig'
blackpig=Pig()
blackpig.body='瘦弱'
print(Pig.color)
print(blackpig.color)
print(blackpig.body)
print(blackpig.pp)
结果:
注意:此时的pp就是一个属性,不再是一个方法。
十,为属性添加安全保护机制
使用@property装饰出的属性,不能修改,但可以访问。
比如:
class Pig:
"""
猪类
"""
color='白色'
def __init__(self):
self.body="肥胖"
print("我是猪类")
@property
def pp(self):
print('我是一头大肥猪')
return 'pigpig'
blackpig=Pig()
blackpig.body='瘦弱'
print(Pig.color)
print(blackpig.color)
print(blackpig.body)
print(blackpig.pp)
blackpig.pp="我不是一头大肥猪"
结果:
十一,继承
通过继承不仅可以实现代码的重用,还能理顺类与类之间的关系。
1,方法
class 子类名(父类名):
“””文档字符串
“”
类体
2,python中允许子类访问父类中除了__init__的方法。
class Pig:
"""
猪类
"""
color='白色'
def __init__(self):
self.body="肥胖"
print("我是猪类")
def pp(self):
print('我是一头大肥猪')
class Black_Pig(Pig):
"""
猪类中的黑猪类
"""
color1='黑色'
def __init__(self):
print('我的颜色:'+Black_Pig.color1)
ppp=Black_Pig()
ppp.pp()
结果:
3,方法重写
当父类中的某个方法不完全使用子类时,就可以使用方法重写。
class Pig:
"""
猪类
"""
color='白色'
def __init__(self):
self.body="肥胖"
print("我是猪类")
def pp(self):
print('我是一头大肥猪')
class Black_Pig(Pig):
"""
猪类中的黑猪类
"""
color1='黑色'
def __init__(self):
print('我的颜色:'+Black_Pig.color1)
def pp(self):
print('我不是一头大肥猪')
ppp=Black_Pig()
ppp.pp()
结果:
4,使用super()方法可以让父类中的__init__方法被子类调用。
class Pig:
"""
猪类
"""
color='白色'
def __init__(self):
self.body="肥胖"
print("我是猪类")
def pp(self):
print('我是的体重是:',self.body)
class Black_Pig(Pig):
"""
猪类中的黑猪类
"""
color1='黑色'
def __init__(self):
print('我的颜色:'+Black_Pig.color1)
super().__init__()
ppp=Black_Pig()
ppp.pp()
结果:
和平精英滴滴我,id:supremeboss