初学Python:面向对象总结
2019-04-16 Python 3x
一、 面向对象的含义和特性
面向对象是将世界中的具体事物进行抽象,从而能够更好的帮助我们归纳总结,解决复杂问题的一种解决问题的思路。
面向对象的三个特性——封装、继承、多态。
类和对象是面向对象中的两个重要概念。
类:是对事物的抽象,比如汽车模型。
对象:是类的一个实例,比如:大卡车。
二者之间的联系:类是把对象抽象化,对象是把类实例化。这个有点像哲学上上的个体和整体。当然个体还可以继续细分,这种就是一种分而治之和分类思想。
二、类
类:是对事物的抽象,比如汽车模型。
1. Python中类的定义、结构、创建
使用class关键字定义一个类,并且类名首字母要大写;
创建的类型不能用简单类型表示时就需要创建类;
类把需要的变量和函数组合,这种包含也称之为“封装”
2. Python类的结构
Class 类名:
成员变量(属性)
成员函数(方法)
3. 类的创建
class MyClass():
def fun(self): # self 是必须的
print('I am fuction")
4. 类的属性
类由属性和方法组成,类的属性是对数据的封装,类的方法则是对类的行为的封装。类的属性按使用范围分为公有属性和私有属性,类的属性范围取决于属性的名称。
公有属性:类中和类外都可以调用的属性
私有属性:不能被类以外的函数调用,只能通过类的内部方法调用。(其实也可以通过instance.classname__attribute方式访问,但只用于调试程序)。定义方式:以"–"双下划线开始的成员变量就是私有属性,否则是共有属性。
内置属性:由系统在定义类的时候默认添加的,由前后两个下划线构成
#!/usr/bin/python
#coding:utf-8 name ='Jock' # 定义全局变量
class Ren(object): # 定义类,class Ren或者class Ren()都可以
name = '人' # 定义公有属性
__money = '我有十块钱' # 定义私有属性 def run(self): # 定义方法(函数),必须要有一个形参,通常用self
print('跑步')
print(name) # 调用全局变量name='Jock'
print(self.name) # 调用类属性name='人' def say(self):
lie = "我很欣赏你" # 定义局部变量,注意这个不是类的公有属性
print(self.__money) # 内部调用私有属性
print(lie) # 调用局部变量 if __name__ == '__main__': # 直接调用则执行,被调用则不执行
zhangsan = Ren() # 实例化类,创建对象
print(zhangsan.name) # 调用类的公有属性name='人’
zhangsan.name='张三' # 对实例zhangsan的name属性重新赋值为'张三'
print(zhangsan.name) # 输出>>>张三
zhangsan.run() # 调用成员函数fun()
zhangsan.say() # 调用成员函数say()
print(zhangsan._Ren__money) # 另外一种访问私有属性的方式,仅在测试时使用
print('#'*50)
print(Ren.__dict__) # 调用内置属性'__dict__'
#!/usr/bin/python
#coding:utf-8 class Name():
var1 = '类属性,公有属性'
__var2 = '类的私有属性' def fun(self):
self.var2 = '对象的公有属性var2'
self.__var3 = '对象的私有属性__var3'
var4 = '函数fun的局部变量var4' tan = Name() print(tan.var1)
print(Name.var1)
qi = Name()
tan.fun()
print(tan.var2) #print(qi.var2) # 会报错,因为qi这个实例还没有调用fun()函数
#print(tan.var4) # 会报错,因为var4是局部变量只能在函数内部使用。
5. 类的方法
和函数定义一样,但需要self作为第一个参数。
类的方法也分为:公有方法和私有方法。
公有方法:只有实例化之后才能被调用。
私有方法:不能被外部的类和方法调用,私有方法的定义和私有属性定义都是一样的,在方法前面加上’__'双下划线就可以了;
类方法:被classmethod()函数处理过的函数,能被类所直接调用,也能被对象所调用(是继承关系)
静态方法:相当于"全局函数",可以被类直接调用,可以被所有实例化对象共享,通过staticmethod()定义静态方法没有"self"语句;
self参数:用于区分函数和类的方法(必须有一个self),self参数表示指向对象本身。
#!/usr/bin/python
#coding:utf-8 class Name():
name = 'Jock'
__money = '我有十块钱' # 定义私有属性
__age = 24 # 定义私有属性 def fun1(self): # 定义公有方法
print(self.name)
print('我是公有方法')
#__fun2() # 直接调用__fun2会报错,提示NameError: name '_Name__fun2' is not defined
self.__fun2() # 调用私有方法 def __fun2(self): # 定义私有方法,只能在类定义里面被调用
print(self.name)
print('我是私有方法') def get(self,x): # 获取私有属性的值
if x == 'money':
return self.__money
else:
return self.__age def set(self,x): # 改变私有属性
self.__age = x @classmethod # 装饰器,声明下面这个函数是动态方法,可以直接被类调用,这种方法最好
def classFun(self): # 定义动态方法
print(self.name)
print('我是类方法')
# 另外一种解决办法,使用classmethod()函数
# classNewFun = classmethod(classFun) @staticmethod # 装饰器,声明下面这个函数是静态方法,可以直接被类调用,这种方法最好
def staticFun(): # 不能有self,定义静态方法
print(Name.name) # 需要通过Name.name调用类的name属性
print('我是静态方法')
# 另一种解决办法,使用staticmethod()函数
# staticNewFun = staticmethod(staticFun)
"""
二者实际原理
动态方法是动态加载内部的属性和方法,现加载,节省空间,不过执行速度不如静态方法
静态方法是在执行前先加载静态方法的所有属性和方法,然后再执行,执行速度快,不过占用空间多
一般大数据才需要考虑资源空间效率问题
"""
print('#'*80)
tan = Name()
tan.fun1()
print('#'*80)
# Name.fun1 # 报错,因为公有方法必须实例化调用才行。类本身无法直接调用类自身的公有方法
Name.classFun()
print('#'*80)
Name.staticFun()
print('#'*80)
print(tan.get('age')) 获取类的私有属性
print('#'*80)
tan.set(20) # 设置类的私有属性
print(tan._Name__age) # 测试,访问私有属性
三、对象
对象:是类的一个实例,比如:大卡车。类是把对象抽象化,对象是把类实例化。这个有点像哲学上上的个体和整体。当然个体还可以继续细分,这种就是一种分而治之和分类思想。
1. 对象的创建
创建对象的过程称之为实例化;当一个对象被创建后,包含三个方面的特性:对象的句柄、属性、方法。
1)句柄用于区分不同对象;
2)对象对象的属性和方法与类中的成员变量和成员函数对应。
注:还有继承、多态、析构函数、构造函数没有总结进去。
四、设计一个三维向量类,实现向量的加减法以及向量与标量的乘法和除法。
源代码如下:
1、定义三维向量运算类:Three_arithmetic
class Three_arithmetic:
def add(self,a,b):
c=a[0]+b[0],a[1]+b[1],a[2]+b[2]
return c
def subtr(self,a,b):
c=c=a[0]-b[0],a[1]-b[1],a[2]-b[2]
return c
def num_mult(self,a,k):
c=k*a[0],k*a[1],k*a[2]
return c
def num_divi(self,a,k):
c=a[0]/k,a[1]/k,a[2]/k
return c
2、运行上述程序后,代码运算示例如下:
a=(1,1,1) //输入向量a,a为元组
b=(2,2,2) //输入向量b,b为元组
k=Three_arithmetic() //实例化
k.add(a,b) //引用类函数add,将两个向量相加
k.subtr(a,b) //引用类函数subtr,将两个向量相减
k.num_mult(a,2) //引用类函数num_mult,将向量a乘以2
k.num_divi(a,2) //引用类函数num_divi,将向量a除以2
3、执行结果如下:
Python 3.7.2 (tags/v3.7.2:9a3ffc0492, Dec 23 2018, 22:20:52) [MSC v.1916 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license()" for more information.
>>>
================== RESTART: C:/Users/Benny/Desktop/temp.py ==================
>>> a=(1,1,1)
>>> b=(2,2,2)
>>> k=Three_arithmetic()
>>> k.add(a,b)
(3, 3, 3)
>>> k.subtr(a,b)
(-1, -1, -1)
>>> k.num_mult(a,2)
(2, 2, 2)
>>> k.num_divi(a,2)
(0.5, 0.5, 0.5)
>>>
初学Python:面向对象总结的更多相关文章
- 初学Python——面向对象编程
一.面向对象 or 面向过程? 编程范式: 编程是 程序 员 用特定的语法+数据结构+算法组成的代码来告诉计算机如何执行任务的过程 , 一个程序是程序员为了得到一个任务结果而编写的一组指令的集合,正所 ...
- 初学Python——面向对象(二)
一.抽象类.接口类和抽象接口 转自博客园魏恒https://www.cnblogs.com/weihengblog/p/8528967.html (一)接口类 什么是接口类?在继承中,我们可以声明某个 ...
- python 面向对象初级篇
Python 面向对象(初级篇) 概述 面向过程:根据业务逻辑从上到下写垒代码 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 面向对象:对函数进行分类和封装,让开发" ...
- 初学Python
初学Python 1.Python初识 life is short you need python--龟叔名言 Python是一种简洁优美语法接近自然语言的一种全栈开发语言,由"龟叔&quo ...
- Python 面向对象 基础
编程范式概述:面向过程 和 面向对象 以及函数式编程 面向过程:(Procedure Oriented)是一种以事件为中心的编程思想. 就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现 ...
- python面向对象进阶(八)
上一篇<Python 面向对象初级(七)>文章介绍了面向对象基本知识: 面向对象是一种编程方式,此编程方式的实现是基于对 类 和 对象 的使用 类 是一个模板,模板中包装了多个“函数”供使 ...
- python 面向对象(进阶篇)
上一篇<Python 面向对象(初级篇)>文章介绍了面向对象基本知识: 面向对象是一种编程方式,此编程方式的实现是基于对 类 和 对象 的使用 类 是一个模板,模板中包装了多个“函数”供使 ...
- python 面向对象编程学习
1. 问题:将所有代码放入一个py文件:无法维护 方案:如果将代码才分放到多个py文件,好处: 1. 同一个名字的变量互相不影响 2.易于维护 3.引用模块: import module 2.包:解决 ...
- Python面向对象详解
Python面向对象的"怜人之处" Python的待客之道--谁能进来 Python的封装--只给你想要的 Python的继承--到处认干爹 Python的多态--说是就是
- python 面向对象和类成员和异常处理
python 面向对象 你把自己想象成一个上帝,你要创造一个星球,首先你要把它揉成一个个球,两个直径就能创造一个球 class star: '''名字(name),赤道直径(equatorial di ...
随机推荐
- Broadcom BCM94352z/DW1560驱动新姿势
转自:https://blog.daliansky.net/Broadcom-BCM94352z-DW1560-drive-new-posture.html Broadcom WiFi/BlueToo ...
- c# 操作word写入特殊字符
在word中插入特殊字符(word 2010): 插入-符号-选择特殊符号,如图: c#操作 :首先要得到插入符号的字符代码,在上图中有显示,然后word模板改为相应的字体,具体插入代码如下 ...
- Web 应用程序项目 Himall.Web 已配置为使用 IIS。 无法访问 IIS 元数据库
Web应用程序项目XXXX已配置为使用IIS.无法访问IIS元数据库.您没有足够的特权访问计算机上的IIS网站,xxxxiis 问题:Windows8下直接使用VS打开项目,出现问题:XXXX已配置为 ...
- 将asp.net mvc的aspx视图转化为Razor视图
ASP.NET MVC2.0的项目如何升级到3.0?? 前言:微软在2009年3月份推出了MVC之后,可以说是发展的速度非常快,仅仅过了不到3年的时间,MVC版本已经从1.0到达4.0,尤其是2.0和 ...
- UI设计篇·入门篇·简单动画的实现,为布局设置动画,用XML布置布局动画
不仅仅控件可以设置动画,一个布局也可以设置动画, 当给一个布局设置了动画的时候,这个布局里所包含的控件都会依赖执行这些动画. 为布局设置动画的实现步骤: 1.新建一个动画,设置需要实现的形式 2.新建 ...
- Spark sql 在yarn-cluster模式下找不到表
在hive里建一个数据库test,在数据库里建了一张表user,然后在Spark程序中使用Spark sql读取这张表 "select * form test.user" 当部署模 ...
- 1.PHP与Web页面的交互
一.概览: PHP是一种专门用于Web开发的服务器端脚本语言.从这个描述可以知道,PHP要打交道的对象主要有服务器(Server),和基于Web的HTML(超文本标识语言).使用PHP处理Web应用时 ...
- 算法之Python实现 - 001 : 换钱的最少货币数
[题目]给定数组arr,arr中所有的值都为正数且不重复.每个值代表一种面值的货币,每种面值的货币可以使用任意张,再给定一个整数aim代表要找的钱数,求组成aim的最少货币数. [代码1]:时间与额外 ...
- install linux on VM
1. install完成之后,没有UI,可以在安装的向导过程中配置,先点击language,选择英语,然后再software那里 勾选,server with gui->KDE, 一定要在看到的 ...
- Fiddler基础使用三之请求过滤
在我们抓包的时候如果不设置过滤,那么所有操作中的请求都会被捕获下来,如果我们只想查看指定或者某些请求信息,那么太多的session会给我们造成困扰,增加查找难度.所以我们需要设置过滤区域.fiddle ...