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 安装virtualenv和virtualenvwrapper的方法
Jan 13 Python
pandas将DataFrame的列变成行索引的方法
Apr 10 Python
python 编码规范整理
May 05 Python
python web自制框架之接受url传递过来的参数实例
Dec 17 Python
解决django前后端分离csrf验证的问题
Feb 03 Python
Python面向对象程序设计构造函数和析构函数用法分析
Apr 12 Python
详解Python odoo中嵌入html简单的分页功能
May 29 Python
python实现在函数中修改变量值的方法
Jul 16 Python
python3 requests库实现多图片爬取教程
Dec 18 Python
Python递归调用实现数字累加的代码
Feb 25 Python
python+requests接口压力测试500次,查看响应时间的实例
Apr 30 Python
pytorch交叉熵损失函数的weight参数的使用
May 24 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
CI框架自动加载session出现报错的解决办法
2014/06/17 PHP
php实现格式化多行文本为Js可用格式
2015/04/15 PHP
php操作MongoDB类实例
2015/06/17 PHP
Yii实现Command任务处理的方法详解
2016/07/14 PHP
javascript ajax 仿百度分页函数
2013/10/29 Javascript
JS实现侧悬浮浮动实例代码
2013/11/29 Javascript
jQuery实现视频作为全屏幕背景
2014/12/18 Javascript
jQuery弹出框代码封装DialogHelper
2015/01/30 Javascript
JavaScript里 ==与===区别详解
2016/08/16 Javascript
jQuery复制节点用法示例(clone方法)
2016/09/08 Javascript
JavaScript高仿支付宝倒计时页面及代码实现
2016/10/21 Javascript
vue货币过滤器的实现方法
2017/04/01 Javascript
js封装成插件的步骤方法
2017/09/11 Javascript
浅析vue给不同环境配置不同打包命令
2018/08/17 Javascript
对angular 实时更新模板视图的方法$apply详解
2018/10/09 Javascript
Nodejs让异步变成同步的方法
2019/03/02 NodeJs
JS实现马赛克图片效果完整示例
2019/04/13 Javascript
解决包含在label标签下的checkbox在ie8及以下版本点击事件无效果兼容的问题
2019/10/27 Javascript
vue组件添加事件@click.native操作
2020/10/30 Javascript
python连接池实现示例程序
2013/11/26 Python
Python 判断 有向图 是否有环的实例讲解
2018/02/01 Python
python解压TAR文件至指定文件夹的实例
2019/06/10 Python
python自定义时钟类、定时任务类
2021/02/22 Python
Python爬虫 urllib2的使用方法详解
2019/09/23 Python
浅谈Python访问MySQL的正确姿势
2020/01/07 Python
Django ORM filter() 的运用详解
2020/05/14 Python
Matplotlib animation模块实现动态图
2021/02/25 Python
解决Pyinstaller打包软件失败的一个坑
2021/03/04 Python
圣诞树世界:Christmas Tree World
2019/12/10 全球购物
文秘专业大学生求职信
2013/11/10 职场文书
《乌塔》教学反思
2014/02/17 职场文书
亮化工程实施方案
2014/03/17 职场文书
村安全生产责任书
2014/08/25 职场文书
打架赔偿协议书范本
2014/10/26 职场文书
幼儿园老师个人总结
2015/02/28 职场文书
2015年乡镇纪委工作总结
2015/05/26 职场文书