Python 面向对象部分知识点小结


Posted in Python onMarch 09, 2020

本文实例讲述了Python 面向对象部分知识点。分享给大家供大家参考,具体如下:

面向对象:

世间万物,皆可分类。--------------------手机《--------------某一个分类

世间万物,皆为对象。--------------------我的手机《---------有具体指向

只要是对象,就肯定属于某种品类。

只要是对象,就肯定有属性。

类的相同点一起写,不同点分开写。

1.Python类中self的来源:

通常函数的执行方式为:

调用函数--》执行函数----》返回该函数的执行结果(得到一个内存地址)

Python类中方法却不是这样执行的,

而是在实例化对象的同时也将此时的对象名称传入。然后在类中__init__需要一个参数接受该对象,故选用self,self代表的是当前对象的引用,指向的是同一块内存地址,所以不需要使用return返回值。

2.为什么类中的方法最少有一个self参数?

这是由于类中的方法是类内部共存(共享)的,不像其他字段属性每次都在内存中复制得有,但是得知道每次调用该方法的对象是谁,需要将调用这个方法的对象传递到该方法中,故需要一个self接收该对象。在底层是通过----》类.方法(对象名)实现该过程的。最终的实现是谁调用这个方法,谁就把自己传递给该方法。 类名.方法名(类的对象)

r=Role(‘WFB')  Role是一个类,类中有一个got_shot()方法。

r.got_shot()======》实质为Role.got_shot(r)

3.在构造函数中初始化:在内存中开辟一块空间,然后将一些值进行存储。对于没有在构造函数中初始化的方法是在类的内存当中的,而不是在实例的内存空间里。

4.python 类变量和实例变量

类变量既可以通过实例也可以通过类来访问,这是因为访问顺序是默认先访问实例的,若实例中没有则来访问类的。

实例变量是可以增加的,也是可以删除的,体现为:

4.1增加

4.1.1  在类初始化时是通过构造函数__init__()中接收的self参数然后进行赋值,如下

class Role:
  def __init__(self, name):
    #在实例化时做一些类的初始化的工作
    self.name = name #实质为r1.name=name实例变量(静态属性),作用域就是实例本身

实质为:

r=Role("wfb")===>r=Role(r,"wfb") ,然后通过r.name=name在构造函数中进行赋值。

4.1.2  在类实例后单独增加,现在新增一个实例变量范围只针对该实例。

例如:

r=Role("wfb")
r.gender="男"

上述两者实质是一样的,只是赋值时间有区别,一个是在类在实例化(调用构造函数)时赋值。一个是在实例化之后再在赋值操作。同样可以达到为某实例增加属性的目的。

4.2删除  

删除实例变量(只是针对当前的对象)。

方式为=>

del r.name

这样该实例就没有了该变量,但是不会影响其他的实例变量。

5.在实例中是否可以改类中的类变量??

class Role:
n="我是类变量"
  def __init__(self, name):
    #在实例化时做一些类的初始化的工作
    self.name = name #实质为r1.name=name实例变量(静态属性),作用域就是实例本身
r1=Role("wfb")
r1.n="我是修改后变量"
Print("r.n===%s"%r.n) #=====>输出我是修改后变量

r2=Role("WFB Nice")
Print("r2.n===%s"%r2.n) #======>输出为我是类类变量。
#先在实例中查找是否有n,没有则去查找类中是否有。

总结:通过试验可以知道 我们通过实例修改类中同名的变量,实质为是在该实例的内存中新增了一个与类变量同名的实例变量。其他实例来调用该类中的类变量时,其中类变量的值是没有发生变化的。

6.通过类是否可以直接修改类的的类变量??【类名.类变量==值】、

结论为:若实例中已有新增的与类变量同名的则变量值为实例中的变量值,否则则是修改后的类变量值,这是由于访问顺序是默认先访问实例的,若实例中没有则来访问类的。

需要注意的是若变量是一个list则修改一个影响全部,这是由于他们共用的是同一个内存地址。

实例变量是为了区别每个对象的不同点,而类变量是该类所用实例对象共用的。当某个对象实例中关于这个类变量需要不同值,可以为该对象实例新增一个与类变量同名的实例变量。

7.私有属性、私有方法=====》体现了封装

格式为:

私有属性:__attr  

私有方法:def __way(self): pass

特性:只能是在改类中访问,若外部需要私有属性或者方法,解决方法为在该类的内部定义一个可供外部访问的方法,然后在该方法中调用私有属性或方法。

8.继承

继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。

继承概念的实现方式主要有2类:实现继承、接口继承。

实现继承是指使用基类的属性和方法而无需额外编码的能力。

接口继承是指仅使用属性和方法的名称、但是子类必须提供实现的能力(子类重构父类方法)。

8.1 类的继承

8.1.1 继承的定义

class Person(object):  # 定义一个父类
  def talk(self):  # 父类中的方法
    print("person is talking....") 
class Chinese(Person):  # 定义一个子类, 继承Person类
  def walk(self):   # 在子类中定义其自身的方法
    print('is walking...')
c = Chinese()
c.talk()   # 调用继承的Person类的方法
c.walk()   # 调用本身的方法

输出

person is talking....
is walking...

8.1.2 构造函数的继承

 如果我们要给实例 c 传参,我们就要使用到构造函数,那么构造函数该如何继承,同时子类中又如何定义自己的属性?

继承类的构造方法:

        1.经典类的写法: 父类名称.__init__(self,参数1,参数2,...)

        2. 新式类的写法:super(子类,self).__init__(参数1,参数2,....)

class Person(object):
  def __init__(self, name, age):
    self.name = name
    self.age = age
  def talk(self):
    print("person is talking....")
class Chinese(Person):
  def __init__(self, name, age, language): # 先继承,在重构
    Person.__init__(self, name, age) #继承父类的构造方法,也可以写成:super(Chinese,self).__init__(name,age)
    self.language = language  # 定义类的本身属性
  def walk(self):
    print('is walking...')
class American(Person):
  pass
c = Chinese('wfb', 22, 'Chinese')

总结:假如只是简单的在子类Chinese中定义一个构造函数,其实就是在重构。这样子类就不能继承父类的属性了。所以我们在定义子类的构造函数时,要先继承再构造,这样我们也能获取父类的属性了。

子类构造函数基础父类构造函数过程如下:

      实例化对象c ----> c 调用子类__init__()  ---- > 子类__init__()继承父类__init__()  ----- > 调用父类 __init__()

8.1.3 对父类方法的继承

如果我们对基类/父类的方法需要修改,可以在子类中重构该方法。如下的talk()方法。

class Person(object):
  def __init__(self, name, age):
    self.name = name
    self.age = age
  def talk(self):
    print("person is talking....")
class Chinese(Person):
  def __init__(self, name, age, language): 
    Person.__init__(self, name, age) 
    self.language = language
    print(self.name, self.age, self.language)
  def talk(self): # 子类 重构方法
    print('%s is speaking chinese' % self.name)
  def walk(self):
    print('is walking...')
c = Chinese('wfb', 22, 'Chinese')
c.talk()

输出

wfb is speaking chinese

关于多继承是按照从左到右【代码中提现方式】继承的,在继承上存在一个先后关系,其中构造函数只会继承一个(从从左到右谁先有就继承谁的)。

 例如:

class A:
  def __init__(self):
    print("A")
class B(A):
  def __init__(self):
    print("B")

class C(A):
  def __init__(self):
    print("C")
 
class D(B, C):
  pass

d = D()
# 结果输出的为B

特别的:

 Python 面向对象部分知识点小结

9. 多态:一个接口多种实现。  作用:接口重用。

学习git为     https://gitee.com/FelixBinCloud/PythonLearn/tree/master/PythonLearn

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
python中尾递归用法实例详解
Apr 28 Python
Python实现自定义顺序、排列写入数据到Excel的方法
Apr 23 Python
python使用knn实现特征向量分类
Dec 26 Python
浅谈python3发送post请求参数为空的情况
Dec 28 Python
Python爬虫——爬取豆瓣电影Top250代码实例
Apr 17 Python
python3 tcp的粘包现象和解决办法解析
Dec 09 Python
Pytorch之Variable的用法
Dec 31 Python
python批量处理txt文件的实例代码
Jan 13 Python
Transpose 数组行列转置的限制方式
Feb 11 Python
python+opencv实现移动侦测(帧差法)
Mar 20 Python
解决 jupyter notebook 回车换两行问题
Apr 15 Python
Python实现byte转integer
Jun 03 Python
Django跨域资源共享问题(推荐)
Mar 09 #Python
python为Django项目上的每个应用程序创建不同的自定义404页面(最佳答案)
Mar 09 #Python
Python模块相关知识点小结
Mar 09 #Python
Django操作session 的方法
Mar 09 #Python
Python装饰器用法与知识点小结
Mar 09 #Python
Django中的session用法详解
Mar 09 #Python
python实现引用其他路径包里面的模块
Mar 09 #Python
You might like
解析php中session的实现原理以及大网站应用应注意的问题
2013/06/17 PHP
PHP统计目录大小的自定义函数分享
2014/11/18 PHP
一段批量给页面上的控件赋值js
2010/06/19 Javascript
基于jQuery的输入框无值自动显示指定数据的实现代码
2011/01/24 Javascript
jquery ajax学习笔记2 使用XMLHttpRequest对象的responseXML
2011/10/16 Javascript
JS前端知识点总结之页面加载事件,数组操作,DOM节点操作,循环和分支
2019/07/04 Javascript
浅谈Vue.set实际上是什么
2019/10/17 Javascript
jQuery利用cookie 实现本地收藏功能(不重复无需多次命名)
2019/11/07 jQuery
vue组件系列之TagsInput详解
2020/05/14 Javascript
浅谈Vue 自动化部署打包上线
2020/06/14 Javascript
vue 修改 data 数据问题并实时显示操作
2020/09/07 Javascript
[55:45]DOTA2上海特级锦标赛D组败者赛 Liquid VS COL第一局
2016/02/28 DOTA
Python函数参数类型*、**的区别
2015/04/11 Python
python在linux系统下获取系统内存使用情况的方法
2015/05/11 Python
使用Python求解最大公约数的实现方法
2015/08/20 Python
用Python逐行分析文件方法
2019/01/28 Python
python爬虫实现中英翻译词典
2019/06/25 Python
python自动循环定时开关机(非重启)测试
2019/08/26 Python
使用PyInstaller将Pygame库编写的小游戏程序打包为exe文件及出现问题解决方法
2019/09/06 Python
python set集合使用方法解析
2019/11/05 Python
Python基于Socket实现简单聊天室
2020/02/17 Python
Python如何实现小程序 无限求和平均
2020/02/18 Python
Philosophy美国官网:美国美容品牌
2016/08/15 全球购物
德国奢侈品网上商城:Mytheresa
2016/08/24 全球购物
红色康乃馨酒店:Red Carnation Hotels
2017/06/22 全球购物
一家专门经营包包的英国网站:MyBag
2019/09/08 全球购物
Brasty罗马尼亚:购买手表、香水、化妆品、珠宝
2020/04/21 全球购物
同学会邀请书大全
2014/01/12 职场文书
好矿嫂事迹材料
2014/01/21 职场文书
超市国庆节促销方案
2014/02/20 职场文书
《这儿真好》教学反思
2014/02/22 职场文书
2015年质检工作总结
2015/05/04 职场文书
教师旷工检讨书
2015/08/15 职场文书
小学副班长竞选稿
2015/11/21 职场文书
2016年党员公开承诺书范文
2016/03/24 职场文书
如何使用PyCharm及常用配置详解
2021/06/03 Python