python面向对象

2019/01/10 00:49
阅读数 16

面向对象:

一种认识世界,分析世界的方法论,将万事万物抽象为类

类是抽象的概念,是万事万物的抽象,是一类事物的共同特征的集合,用计算机语言来描述类,就是属性和方法的集合

属性:它是对象状态的抽象,用数据结构来描述;

操作:它是对象行为的抽象,用操作名和实现该操作的方法来描述

一切皆对象,对象是数据和操作的封装

面向对象三要素:

1、封装:将数据和操作组装到一起,对外只暴露一些接口,通过接口访问对象。

2、继承:多继承少修改,使用继承来改变,来体现个性

3、多态:继承和复用

定义:

__init__()方法的第一个参数self就是指代某一个实例,该方法不能有返回值,也就是只能是None

类实例化后,得到一个实例对象,实例对象会绑定方法,调用方法时采用tom.show()的方式,其中的self就是tom,python会把方法的调用者作为第一参数self的实参传入,self.name就是tom对象的name,name是保存在了tom对象上,而不是Person类上,称为实例变量

实例变量是每一个实例自己的变量,是自己独有的;类变量是类的变量,是类的所有实例共享的属性和方法

类属性保存在类的__dict__中,实例属性保存在实例的__dict__中,从实例访问类的属性,就需要借助__class__找到所属的类,如:tom.__class__.__dict__

是类的,也是这个类所有实例的,其实例都可以访问到;是实例的,就是这个实例自己的,通过类访问不到;类变量是属于类的变量,这个类的所有实例可以共享这个变量;实例可以动态的给自己增加一个属性,实例.__dict__[变量名] 和 实例.变量名 都可以访问到到

一般,类变量使用全大写来命名

 

装饰一个类:为一个类通过装饰,增加一些类的属性

只所以能够装饰,本质上是为类对象动态的添加了一个属性,而Person这个标识符指向这个类对象

 

类方法:

1、在类定义中,使用@classmethod装饰器修饰的方法

2、必须至少有一个参数,且第一个参数留给了cls,cls指代调用者即类对象本身

3、通过cls可以直接操作类的属性

 

静态方法:

1、在类定义中,使用@staticmethod装饰器修饰的方法

2、调用时,不会隐式的传入参数,静态方法只是表明这个方法属于这个名词空间,函数归在一起,方便组织管理。

 

 私有变量:使用双下划线开头的属性名,就是私有属性

私有变量的本质:类定义的时候,如果声明一个实例变量的时候,使用双下划线,python解释器会将其改名,转换名称为 _类名__变量名 的名称,所以用原来的名字访问不到,若要访问这个私有变量,需要定义方法getage(),使用方法来访问

如上例中,可以使用p1._Person__age来对私有变量进行访问和修改

 

保护变量:在变量名前使用一个下划线,称为保护变量

可以看出,这个_age属性根本就没有改变名称,和普通属性一样,解释器不做任何处理,是一种约定,看到这种变量,就如同私有变量,不要直接使用

 

私有方法:参照保护变量,私有变量,使用单下划线和双下划线命名的方法

单下划线的方法只是开发者之间的约定,解释器不会做任何改变;双下划线的方法,是私有方法,解释器会改名,改名策略和私有变量相同,_类名__方法名,方法和变量都在类的__dict__中可以找到

 

补丁:可以通过修改或者替换类的成员,使用者调用的方式没有改变,但是,类提供的功能可能已经改变了

猴子补丁:

在运行时,对属性、方法、函数等进行动态替换,其目的是为了通过替换、修改来增强、扩展原有代码的能力。

 

 属性装饰器:一般好的设计是把实例的属性保护起来,不让外部直接访问,外部使用getter读取属性和setter设置属性

使用property装饰器的时候三个方法同名

property装饰器:后面跟的函数名就是以后的属性名,它就是getter,这个必须有,有了它至少是可读属性

setter装饰器:与属性名同名,且接收两个参数,第一个是self,第二个是将要赋的值,有了它,属性可写

delter装饰器:可以控制是否删除属性。很少用

property装饰器必须在前,setter,delter装饰器在后

 

对象的销毁:

类中可以定义__del__方法,称为析构函数(方法)

作用:销毁类的实例的时候调用,以释放占用的资源,其中就放些清理资源的代码,比如释放连接。

这个方法不能引起对象的真正的销毁,只是对象销毁的时候会自动调用它。

使用del语句删除实例,引用计数减一,当引用计数为0时,会自动调用__del__方法,由于python实现了垃圾回收机制,不能确定对象何时执行垃圾回收。

由于垃圾回收对象销毁时,才会真正清理对象,还会在之前自动调用__del__方法,除非明确知道自己的目的,建议不要手动调用这个方法。

 

python不需要方法重载

 

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部