Python之面向对象
Python面向对象
- 面向对象编程
- 一、类的构造方法、析构方法和内置属性
- 1.类的构造方法和析构方法
- 2.Python类的内置属性
- 二、类的继承
- 三、类的多态
- 四、类的封装
面向对象编程
提示:面向对象编程(OOP)是一种程序设计方法,它的核心就是将显示世界中的概念,过程和事务抽象成Python中的模型,使用这些模型进行程序的设计和构建。因为Python是一种面向对象的语言,所以要想熟练熟练使用Python语言,就一定要掌握类和对象的使用。面向对象的三个重要特征(继承性、封装性、多态性)及声明创建类和对象的方法。
一、类的构造方法、析构方法和内置属性
1.类的构造方法和析构方法
Python类中有两个比较特殊的方法,他们不是某类具备的功能,而是类的专有方法,即构造方法和析构方法。
- 构造方法:实例化类时自定义执行的方法,定义时用__init__形式。【self是必要的参数且为第一个参数,用户可以在__init__()构造方法内加入许多参数,在创建类时同时设置类的属性值。】
- 析构方法:销毁类时自动执行的方法,定义时用__del__形式。
class MarketMember:def __init__(self):print("欢迎光临")def __del__(self):pass
m = MarketMember()
注意:构造方法和析构方法是在特殊情况下或当使用特别语法时由Python替你调用的,不需要在代码中直接调用(类似普通犯法那样),这两个方法在类中都只能被定义一次。
2.Python类的内置属性
- Classname.dict:类内的属性是以字典对象的方法存储的。__dict__属性为该字典对象的值。
- classname.doc:__doc__属性返回此类的文件字符串。
- classname.name:__name__属性返回此类的名称。
- classname.module:__module__属性返回包含此类的模块名称。
- classname.bases:__bases__属性是一个tuple对象,返回此类的基类名称。
class Cc:"这是一个定义类的例子"a = 100class a(Cc):"a继承Cc"b = 200if __name__ == '__main__':print( Cc.__dict__ )print( Cc.__doc__ )print( Cc.__name__ )print( Cc.__module__ )print( Cc.__bases__ )print( a.__bases__ )
运行结果:
{'__module__': '__main__', '__doc__': '这是一个定义类的例子', 'a': 100, '__dict__': <attribute '__dict__' of 'Cc' objects>, '__weakref__': <attribute '__weakref__' of 'Cc' objects>}
这是一个定义类的例子
Cc
__main__
(<class 'object'>,)
(<class '__main__.Cc'>,)
二、类的继承
所谓类的继承(inheritance),就是心累继承就累的属性和方法,这种行为称为派生子类(subclassing)。继承的心累称为派生类(derived class),被继承的旧类则称为基类(base class)。当用户创建派生类后,就可以在派生类内新增或改写基类的任何方法。
class <类名称> [(基类1,基类2,...)]
["文件字符串"]
<语句>
注意:当用户在类内编写函数时,要记得类函数名称空间的搜索顺序是:类的实例–>类–>基类。
三、类的多态
所谓类的多态(polymorphism),就是指类可以有多个名称相同、参数类型却不同的函数。Python并没有明显的多态特性,因为Python函数的参数不必声明数据类型。但是Python利用动态数据类型(dynamic typing),仍然可以处理对象的多态。
因为使用动态数据类型,所以Python必须等到运行该函数时才能知道该函数的类型,这种特性成为运行期绑定(runtime binding)。
class myClass:def __init__(self):passdef handle(self,*args):print(len(args))if len(args) == 1:self.handle1(*args)elif len(args) == 2:self.handle2(*args)elif len(args) == 3:self.handle3(*args)else:print("wrong argumens")def handle1(self,x):print("1 arguments")def handle2(self,x,y):print("1 arguments")def handle3(self,x,y,z):print("3 arguments")if __name__ == '__main__':x = myClass()x.handle()x.handle(1)x.handle(1,2)x.handle(1,2,3)x.handle(1,2,3,4)
结果如下:
0
wrong argumens
1
1 arguments
2
1 arguments
3
3 arguments
4
wrong argumens
四、类的封装
所谓类的封装(encaosulation),就是指类将其属性(变量与方法)封装在该类内,只有该类中的成员,才可以使用该勒种的其他方法。这种被封装的变量与方法,成为该类的私有变量(private variable)与私有方法(private method)。
要做到类的封装,必须遵循以下两个原则:
- 如果属性(方法)名称的第一个字符是单下划线,那么该属性视为类的内部变量,外面的变量不可以引用该属性。
- 如果属性(方法)名称的前两个字符都是单下划线,那么在编译时属性名称 attributeName 会被改成 _className_attributeName,className是该类的名称。由于属性名称之前加上了类的名称,因此与类中原有的属性名称有差异。
# 类的封装
class Fruit:def __init__(self,value):self._n = value # 变量_n的第一个字符是单下划线self.__n = value # 变量__n的前两个字符都是单下划线def __func(self): # 函数的__func()前两个字符都是单下划线print(self._n+1)if __name__ == '__main__':f = Fruit(5.88) print( f._n ) # 第一个字符是单下划线的变量_n,所以可以任意存取 # f.__n # 错误,因为__n已经被改名为 _Fruit__nprint( f._Fruit__n ) # 正确# print( f.__func() ) # 错误,因为__func()已经被改名为_Fruit__func()print( f._Fruit__func() ) # 正确
虽然对类的属性和方法名称前两位字符使用单下划线定义可以视为私有变量和私有方法,正常的访问方式是无法访问的,但不代表这些属性和方法无法在类外部访问,我们可以通过特殊方法访问这些私有变量和私有方法。
私有变量和私有方法除了名称前两位字符使用单下划线定义之外,还可以对名称前一位字符使用单下划线定义,这种方式(名称前一位字符使用单下划线定义)与公有属性或公有方法的调用过程相同,它主要给开发者标记当前属性或方法是私有属性或方法。
总的来说,定义类的私有属性和私有方法的方式如下:
- 使用property属性装饰类的实例方法,使实例方法以类属性的方法访问和调用,在某些程度上实现封装功能。
- 对类的属性和方法名称前两位字符使用单下划线定义,在调用过程中只能通过_class__xxx方式访问(class代表类名, xxx代表属性或方法名称)
- 对类的属性和方法名称前一位字符使用单下划线定义,它与公有属性或公有方法的调用过程相同,主要给开发者标记当前属性或方法是私有属性或方法。
参考资料:
本文编写参考书籍《Python 3.X基础教程》史卫东 编著、Python 3.6 零基础入门与实战 王启明 罗从良 著《精通Python自动化编程》黄永祥 编著
Python之面向对象相关推荐
- 16.1、python初识面向对象(1)
初识面向对象 楔子 你现在是一家游戏公司的开发人员,现在需要你开发一款叫做<人狗大战>的游戏,你就思考呀,人狗作战,那至少需要2个角色,一个是人, 一个是狗,且人和狗都有不同的技能,比如人 ...
- Python初识面向对象
一.Python初识面向对象 1.1 封装 class Person:country='中国' #静态字段,可以直接调用def __init__(self,name,pwd): #Python类自带的 ...
- Python之面向对象类和对象
Python之面向对象类和对象 定义一个类:class 定义类的语法: class Test(object):"""类里定义一类事物共同的技能.可以是变量,也可是函数.& ...
- Python之面向对象进阶
Python之面向对象进阶 进阶有:Python 类的成员.成员修饰符.类的特殊成员. 一.类的成员 类的成员可以分为三大类:字段.方法和属性. 注:所有成员中,只有普通字段的内容保存对象中,即:根据 ...
- python 内存溢出能捕获吗_从0基础学习Python (19)[面向对象开发过程中的异常(捕获异常~相关)]...
从0基础学习Python (Day19) 面向对象开发过程中的=>异常 什么是异常 当程序在运行过程中出现的一些错误,或者语法逻辑出现问题,解释器此时无法继续正常执行了,反而出现了一些错误的 ...
- Python之面向对象继承和派生
Python之面向对象继承和派生 什么是继承: 继承是一种创建新的类的方法.在Python中,新建的类可以继承自一个或多个父类.原始类称为基类或超类. 新建的类称为派生类或子类. Python中类的继 ...
- python基础——面向对象的程序设计
python基础--面向对象的程序设计 1 什么是面向对象的程序设计 面向过程的程序设计的核心是过程,过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东西. 优 ...
- python是面向对象还是面向过程的语言_关于python是面向对象还是面向过程的分析...
关于python是面向对象还是面向过程的分析 发布时间:2020-04-07 16:10:55 来源:亿速云 阅读:24 作者:小新 今天小编给大家分享的是关于python是面向对象还是面向过程的分析 ...
- Python之面向对象的程序设计
Python之面向对象的程序设计 优点:解决了程序的扩展性,对某一个对象单独修改.会立刻反应到整个体系中,如对一个游戏中人物参数的特征和技能进行修改都很容易. 缺点:可控性差,无法向面向过程的程序设计 ...
- 关于Python的面向对象
关于Python的面向对象 面向对象 对象(object) 类(class) 方法(def -> function) 装饰器 本文是我第一个关于代码的文章作品,我会逐个解释介绍我所写的内容,尽量 ...
最新文章
- Python 中异常嵌套
- python爬取本地天气信息_用Python写一个爬取中国天气网的终端版天气预报爬虫
- orb 算法源码实现
- python为什么用号做注释符_Python为什么用#号作注释符?
- 判断两个字符串是否是变形词
- 机器学习中样本不平衡处理办法
- 科普|不同协议下远程服务器文件上传_下载优劣对比
- C字符串数组赋值
- fastdfs 一个group内实现按照不同的项目,指定路径存储.
- mysql 2100,MySQL 实现准实时的表级别DML计数
- Linux Linux函数 Linux聊天程序 基于socket的TCP(有连接的)聊天程序
- 玩转位图(bitmap)
- 十二进制转十进制(n进制转十进制也一样)
- element表格表头显示斜杠
- 响应式布局——媒体查询
- 解决Redis持久化数据丢失
- 《哈利波特》购书最低折扣
- 如何保证缓存一致性?
- 图像去燥:NLM、BM3D
- 2020-11-07