Python面向对象介绍中篇
Python面向对象(2)
1、保护对象的属性
如果有一个对象,当需要对其进行修改属性时,有两种方法
- 对象名.属性名 = 数据 —->直接修改
- 对象名.方法名() —->间接修改
为了更好的保存属性安全,即不能随意修改,一般的处理方式为
- 将属性定义为私有属性
- 添加一个可以调用的方法,供调用
私有共有属性区分
它是以属性命名方式来区分,如果在属性名前面加了2个下划线’__’,则表明该属性是私有属性,否则为公有属性(方法也是一样,方法名前面加了2个下划线的话表示该方法是私有的,否则为公有的)。
2、_del_()
方法
- 当有1个变量保存了对象的引用时,此对象的引用计数就会加1
- 当使用del删除变量指向的对象时,如果对象的引用计数不会1,比如3,那么此时只会让这个引用计数减1,即变为2,当再次调用del时,变为1,如果再调用1次del,此时会真的把对象进行删除
3、单继承
3.1、继承的概念
在程序中,继承描述的是事物之间的所属关系,例如猫和狗都属于动物,程序中便可以描述为猫和狗继承自动物;同理,波斯猫和巴厘猫都继承自猫,而沙皮狗和斑点狗都继承自狗,如下如所示:
3.2、继承示例
说明:
- 虽然子类没有定义
__init__
方法,但是父类有,所以在子类继承父类的时候这个方法就被继承了,所以只要创建Bosi的对象,就默认执行了那个继承过来的__init__
方法总结
- 子类在继承的时候,在定义类时,小括号()中为父类的名字
- 父类的属性、方法,会被继承给子类
3.3、注意点
- 私有的属性,不能通过对象直接访问,但是可以通过方法访问
- 私有的方法,不能通过对象直接访问
- 私有的属性、方法,不会被子类继承,也不能被访问
- 一般情况下,私有的属性、方法都是不对外公布的,往往用来做内部的事情,起到安全的作用
4、多继承
所谓多继承,即子类有多个父类,并且具有他们的特征
注意点
想一想:
如果在上面的多继承例子中,如果父类A和父类B中,有一个同名的方法,那么通过子类去调用的时候,调用哪个?
5、重写与调用父类方法
5.1、重写父类方法
所谓重写,就是子类中,有一个和父类相同名字的方法,在子类中的方法会覆盖掉父类中同名的方法
5.2、调用父类方法
6、多态
其实多态的概念,一般应用于Java这类强类型语言中, 而Python崇尚“鸭子类型”
所谓多态:定义时的类型和运行时的类型不一样,此时就成为多态
- Python伪代码实现Java或C#的多态
鸭子类型
7、类、实例 | 属性
7.1、类属性
class People(object):
name = 'A2Data' #公有的类属性
__age = 22 #私有的类属性
p = People()
print(p.name) #正确
print(People.name) #正确
print(p.__age) #错误,不能在类外通过实例对象访问私有的类属性
print(People.__age) #错误,不能在类外通过类对象访问私有的类属性
7.2、实例属性(对象属性)
class People(object):
address = '北京' #类属性
def __init__(self):
self.name = 'A2Data' #实例属性
self.age = 22 #实例属性
p = People()
p.age =18 #实例属性
print(p.address) #正确
print(p.name) #正确
print(p.age) #正确
print(People.address) #正确
print(People.name) #错误
print(People.age) #错误
通过实例(对象)去修改类属性
class People(object):
country = 'china' #类属性
print(People.country)
p = People()
print(p.country)
p.country = 'japan'
print(p.country) #实例属性会屏蔽掉同名的类属性
print(People.country)
del p.country #删除实例属性
print(p.country)
归纳
如果需要在类外修改
类属性
,必须通过类对象
去引用然后进行修改。如果通过实例对象去引用,会产生一个同名的实例属性
,这种方式修改的是实例属性
,不会影响到类属性
,并且之后如果通过实例对象去引用该名称的属性,实例属性会强制屏蔽掉类属性,即引用的是实例属性
,除非删除了该实例属性
。
8、静态和类 | 方法
8.1、类方法
类对象所拥有的方法,需要用修饰器
@classmethod
来标识其为类方法,对于类方法,第一个参数必须是类对象,一般以cls
作为第一个参数(当然可以用其他名称的变量作为其第一个参数,但是大部分人都习惯以’cls’作为第一个参数的名字,就最好用’cls’了),能够通过实例对象和类对象去访问。
用类方法对类属性修改之后,通过类对象和实例对象访问都发生了改变
8.2、静态方法
需要通过修饰器
@staticmethod
来进行修饰,静态方法不需要多定义参数