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实现方法
Nov 18 Python
Python 包含汉字的文件读写之每行末尾加上特定字符
Dec 12 Python
python 捕获 shell/bash 脚本的输出结果实例
Jan 04 Python
python解析基于xml格式的日志文件
Feb 25 Python
python+selenium实现163邮箱自动登陆的方法
Dec 31 Python
Python基础教程之内置函数locals()和globals()用法分析
Mar 16 Python
在VS Code上搭建Python开发环境的方法
Apr 06 Python
python 通过字符串调用对象属性或方法的实例讲解
Apr 21 Python
Python 中 function(#) (X)格式 和 (#)在Python3.*中的注意事项
Nov 30 Python
解决安装pycharm后不能执行python脚本的问题
Jan 19 Python
关于pycharm 切换 python3.9 报错 ‘HTMLParser‘ object has no attribute ‘unescape‘ 的问题
Nov 24 Python
tensorflow+k-means聚类简单实现猫狗图像分类的方法
Apr 28 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的超级变量$_POST获取HTML表单(HTML Form) 数据
2011/05/07 PHP
PHP中的错误处理、异常处理机制分析
2012/05/07 PHP
PHP面相对象中的重载与重写
2017/02/13 PHP
PHP标准库 (SPL)――Countable用法示例
2020/06/05 PHP
js静态作用域的功能。
2006/12/25 Javascript
解读JavaScript中 For, While与递归的用法
2013/05/07 Javascript
使用js检测浏览器的实现代码
2013/05/14 Javascript
js 编码转换 gb2312 和 utf8 互转的2种方法
2013/08/07 Javascript
JavaScript插件化开发教程 (四)
2015/01/27 Javascript
在JavaScript中操作时间之getUTCDate()方法的使用
2015/06/10 Javascript
JavaScript实现广告弹窗效果
2016/08/09 Javascript
js数组与字符串常用方法总结
2017/01/13 Javascript
Vue.js基础学习之class与样式绑定
2017/03/20 Javascript
React 子组件向父组件传值的方法
2017/07/24 Javascript
jQuery取得元素标签名称小结(附代码)
2017/08/16 jQuery
Angular4学习笔记之根模块与Ng模块
2017/09/09 Javascript
javaScript实现复选框全选反选事件详解
2020/11/20 Javascript
解析vue中的$mount
2017/12/21 Javascript
JS文件中加载jquery.js的实例代码
2018/05/05 jQuery
vue的传参方式汇总和router使用技巧
2018/05/22 Javascript
vue-router的钩子函数用法实例分析
2019/10/26 Javascript
Vue 中 template 有且只能一个 root的原因解析(源码分析)
2020/04/11 Javascript
浅谈vue 组件中的setInterval方法和window的不同
2020/07/30 Javascript
详解基于element的区间选择组件校验(交易金额)
2021/01/07 Javascript
Python去除、替换字符串空格的处理方法
2018/04/01 Python
Python : turtle色彩控制实例详解
2020/01/19 Python
Sneaker Studio乌克兰:购买运动鞋
2018/03/26 全球购物
澳大利亚设计的婴儿和女孩的衣服:Oobi
2018/12/16 全球购物
大气污染防治方案
2014/05/19 职场文书
委托书如何写
2014/08/30 职场文书
入党积极分子自我批评思想汇报
2014/10/10 职场文书
2014年旅游局法制宣传日活动总结
2014/11/01 职场文书
2014年劳动部工作总结
2014/12/11 职场文书
班级管理经验交流材料
2015/11/02 职场文书
这样写python注释让代码更加的优雅
2021/06/02 Python
MySQL的Query Cache图文详解
2021/07/01 MySQL