Python小知识点(5)--面向对象部分

面向对象:

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

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

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

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

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

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实例变量(静态属性),作用域就是实例本身

View Code

实质为:

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...

View Code

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 = nameself.age = agedef 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):passc = 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 = nameself.age = agedef talk(self):print("person is talking....")class Chinese(Person):def __init__(self, name, age, language): Person.__init__(self, name, age) self.language = languageprint(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):passd = D()# 结果输出的为B

特别的:

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

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

posted on 2018-08-05 14:03 WFaceBoss 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/wfaceboss/p/9425329.html

Python小知识点(5)--面向对象部分相关推荐

  1. Python小知识点(3)--装饰器

    Python小知识点(3)--装饰器 (1)装饰器含参数,被装饰函数不含(含)参数 实例代码如下: import time # 装饰器函数 def wrapper(func):def done(*ar ...

  2. Python小知识点——符号字母前出现小波浪线怎么办?

    说明 通常在利用pycharm编写代码时,大家常常会发现自己写的代码运行是没有问题的,但是一些符号或者字母下面总会有一些波浪线,这种情况一般都是由于没有按着PEP 8规范编写代码出现的错误. PEP是 ...

  3. python 小知识点

    1.获取当前文件路径 now_file_path = os.path.dirname(file) 2.对列表删除重复元素,且不改变原有顺序 list = sorted(set(list_data), ...

  4. python小知识点

    1.拼接文件夹名称 base_dir = os.path.dirname(__file__) # 获取当前文件目录 path = os.path.join(base_dir,'123.jpg') # ...

  5. python常用知识点总结-python 类知识点总结

    python 类知识点总结 面向对象思想: 1.设计的时候,一定要明确应用场景 2.由对象分析定义类的时候,找不到共同特征和技能不用强求 1.简述类.对象.实例化.实例这些名词的含义: 类:从一组对象 ...

  6. Python之路番外(第二篇):PYTHON基本数据类型和小知识点

    一.基础小知识点 1.如果一行代码过长,可以用续行符 \ 换行书写 例子 if (signal == "red") and \ (car == "moving" ...

  7. Python之——遇到的小知识点总结

    学习过程中,难免会遇到一些冷门的小知识点,熟悉这些小知识可以在工作中达到事半功倍的效果,尽力消除自己的知识盲区.总之当时的自己花了不少功夫去解决这些问题,因此觉得有必要单独记录下来,以后也许会再遇到, ...

  8. 【小知识点】Python随机生成 Phone 号码,测试用~

    Python 随机生成 Phone 号码 随机手机号码 Python 生成一亿个手机号 用 time 模块生成 随机手机号码 在爬虫实战中,有一项数据是不能采集的,这个数据就是电话号,所以本篇博客补充 ...

  9. python自学篇十[ 面向对象 (四) :王者荣耀小游戏+模拟一个简单的银行进行业务办理的类]

    python基础系列: python自学篇一[ Anaconda3安装 ] python自学篇二[ pycharm安装及使用 ] python自学篇三[ 判断语句if的使用 ] python自学篇四[ ...

最新文章

  1. 用Visio制作周行事历
  2. json对象与.net对象互相转换
  3. openstack nova 源码分析3-nova目录下的service.py
  4. mvp架构 java_GitHub - AnthonyCoder/MvpForJava: 一个可直接快速引入的 Java 版本的模块化 MVP 框架...
  5. 13.MapReduce第3部分(编程实践WordCount)
  6. android ListView 刷新卡顿问题
  7. mysql connector c编程_MySQL数据库之MySQL Connector 编程
  8. 矩阵的变换。包括缩放、平移、错切
  9. java和python互相调用
  10. Java工程师成神之路【转】
  11. NPS, 校外连接校园网
  12. 李佩:阿里本地生活线上线下融合场景中的图像检测技术
  13. 无线渗透学习笔记使用kali系统抓握手包以及跑字典相关
  14. 5.视频监控 - 摄像头接口
  15. Pygame实现小球躲避
  16. cdn连接失败是什么意思_CDN经常连接失败的原因有哪些?
  17. javaweb学生签到考勤请假系统
  18. 汽车电子学习【车载网络CAN/LIN】
  19. u盘插到电脑计算机里没有反应,U盘插在Windows7电脑上没反应怎么办?
  20. 华为新贵!方舟编译器的荣光和使命

热门文章

  1. PYTHON调用JENKINS的API来进行CI
  2. 软件测试的复杂性与经济性
  3. ASP.NET Master Page
  4. linux复盘:构架搭建lamp(安装)
  5. iOS系列教程 目录 (持续更新...)
  6. 很蛋疼的ORA-00911:无效的字符错误
  7. Linux系统中如何关闭触摸鼠标
  8. 40个精美绝伦的国外网站设计作品范例(下)
  9. Android之MediaPlayer播放音乐并实现进度条实例
  10. Android之自定义Adapter的ListView