python类和对象课件_简单解释Python的类和对象
前言:
对象是模拟真实世界,把数据和程序进行封装 。
对象 = 属性+ 方法
我们需要用类来创造一个对象,就像我们要用图纸来造房子一样。在Python中函数名是以小写字母开头 ,类名是以大写字母开头。
0x00:面向对象(Object Oriented)我们一般称为OO,OO的特征有
1.封装
就像我们对列表的操作一样,很多方法已经封装好了,我们只需要调用自己需要的方法的名字就好了
>>> list1 = [2,1,7,4,3]
>>> list1.sort()
>>> list1
[1, 2, 3, 4, 7]
>>> list1.append(9)
>>> list1
[1, 2, 3, 4, 7, 9]
>>>
2.继承
继承是子类自动共享父类之间数据和 方法的机制
>>> class Mylist(list):
pass
>>> list2 = Mylist()
>>> list2.append(5)
>>> list2.append(6)
>>> list2
[5, 6]
>>> list2.append(3)
>>> list2.sort()
>>> list2
[3, 5, 6]
>>>
我们创建的类可以继承列表的很多属性
3.多态
多态就是不同对象对同一方法响应不同的行动
>>> class A:
def fun(self):
print('我是0verflow')
>>> class B:
def fun(self):
print('我是XX')
>>> a = A()
>>> b = B()
>>> a.fun()
我是0verflow
>>> b.fun()
我是XX
>>>
我们上面的程序用到了self,但是它 什么东西我们并没有解释,其实它就相当于一个序号
>>> class Ball:
def setname(self,name):
self.name = name
def kick(self):
print('谁踢我%s。。。。。' % self.name)
>>> a = Ball()
>>> a.setname('A')
>>> b = Ball()
>>> b.setname('B')
>>> c= Ball()
>>> c.setname('C')
0x01:python的 魔法方法 __init__(self)(构造方法):
__init__(self , param1, param2...)
因为我们设置了默认参数如果不传入参数就会报错 。
0x02:公有和私有
公有和私有的意义这里我就不解释了,就是字面意思
默认来说对象的属性和方法都是公有的,为了实现私有Python内部给出了一个name mangling(名字改编,名字重整)的机制
在python中定义私有变量只需要在变量名或函数名前加上‘’__‘’两个下划线,Python所谓的私有只是意义上的,为什么这么说看下面的代码大家就明白了。
>>> class Person:
name = '0verflow'
>>> p = Person()
>>> p.name
'0verflow'
>>> class Preson:
__name = '0verflow'
>>> p = Person()
>>> p.__name
Traceback (most recent call last):
File "", line 1, in
p.__name
AttributeError: 'Person' object has no attribute '__name'
>>>
针对上面的代码想打印私有还是可以的,不过要多写一个函数:
>>> class Preson:
__name = '0verflow'
def getname(self):
return self.__name
>>> p = Preson()
>>> p.getname()
'0verflow'
>>>
其实我们也可以通过另一种方式:_类名__变量名
>>> class Preson:
__name = '0verflow'
def getname(self):
return self.__name
>>> p._Preson__name
'0verflow'
>>>
这里我们在来说一下继承:
被继承者我们 称为基类或父类,继承者我们称为子类,子类可以继承父类的属性和方法。
>>> class Parent:
def hello(self):
print('正在调用父类的方法')
>>> class Child(Parent):
pass
>>> p = Parent()
>>> p.hello()
正在调用父类的方法
>>> c = Child()
>>> c.hello()
正在调用父类的方法
>>> class Child(Parent):
def hello(self):
print('正在调用子类的方法')
>>> c = Child()
>>> c.hello()
正在调用子类的方法
>>> p.hello()
正在调用父类的方法
>>>
在举一个例子说明一下:
import random as r
class Fish:
def __init__(self):
self.x = r.randint(0,10)
self.y = r.randint(0,10)
def move(self):
self.x -= 1
print('我的位置是:',self.x ,self.y)
class Goldfish(Fish):
pass
class Carp(Fish):
pass
class Shark(Fish):
def __init__(self):
self.hungry = True
def eat(self):
if self.hungry:
print('饿了,要进食')
self.hungry = False
else:
print('吃饱了')
从上面的例子运行的结果可以看出,我们在让shark移动的时候莫名其妙的报错了,原因是因为我们从新定义了__init__()所以覆盖掉了父类的方法和属性。针对 这个问题有两种解决的办法:
1.使用未绑定的父类
看一下运行的结果:
>>> fish = Fish()
>>> fish.move()
我的位置是: 2 8
>>> goldfish = Goldfish()
>>> goldfish.move()
我的位置是: 9 0
>>> shark = Shark()
>>> shark.eat()
饿了,要进食
>>> shark.eat()
吃饱了
>>> shark.move()
Traceback (most recent call last):
File "", line 1, in
shark.move()
File "D:\Python\test\test.py", line 10, in move
self.x -= 1
AttributeError: 'Shark' object has no attribute 'x'
>>>
import random as r
class Fish:
def __init__(self):
self.x = r.randint(0,10)
self.y = r.randint(0,10)
def move(self):
self.x -= 1
print('我的位置是:',self.x ,self.y)
class Goldfish(Fish):
pass
class Carp(Fish):
pass
class Shark(Fish):
def __init__(self):
Fish.__init__(self)
self.hungry = True
def eat(self):
if self.hungry:
print('饿了,要进食')
self.hungry = False
else:
我们增加了一行代码 :Fish.__init__(self)这行代码中的self已经不是父类的self了,而是子类的self
运行的结果:
>>> shark = Shark()
>>> shark.move()
我的位置是: -1 3
>>>
2、super()
import random as r
class Fish:
def __init__(self):
self.x = r.randint(0,10)
self.y = r.randint(0,10)
def move(self):
self.x -= 1
print('我的位置是:',self.x ,self.y)
class Goldfish(Fish):
pass
class Carp(Fish):
pass
class Shark(Fish):
def __init__(self):
super().__init__()
self.hungry = True
def eat(self):
if self.hungry:
print('饿了,要进食')
self.hungry = False
else:
print('吃饱了')
这种方法是将上一种方法的那一条添加的语句改为: super().__init__()
看一下运行的结果:
>>> shark = Shark()
>>> shark.move()
我的位置是: -1 5
>>>
第二种方法比较简单便捷,所以我们一般情况会用第二种方法。
多重继承:一个子类可以继承多个父类的属性和方法
>>> class Base1:
def fool1(self):
print('我是fool1')
>>> class Base2:
def fool2(self):
print('我是fool2')
>>> class C(Base1,Base2):
pass
>>> c = C()
>>> c.fool1()
我是fool1
>>> c.fool2()
我是fool2
>>>
多继承很容易导致一些不可知的错误,所以一般情况下我们是不使用的。
python类和对象课件_简单解释Python的类和对象相关推荐
- python函数分几种_简单了解Python中的几种函数
python是支持多种范型的语言,可以进行所谓函数式编程,其突出体现在有这么几个函数: filter.map.reduce.lambda.yield lambda lambda函数的使用方法:在lam ...
- python编写接口自动化脚本_简单的python http接口自动化脚本
摘抄:今天给大家分享一个简单的python脚本,使用python进行http的接口测试,脚本很简单,逻辑是:读取excel写好的测试用例,然后根据excel中的用例内容进行调用,判断预期结果中的返回值 ...
- [转载] python中的且语句_简单探讨python中的语句和语法
参考链接: 在Python中解包:并行分配之外 python程序结构 python"一切皆对象",这是接触python听到最多的总结了.在python中最基层的单位应该就是对象了, ...
- python程序框架的描述_简单介绍Python下自己编写web框架的一些要点
在正式开始Web开发前,我们需要编写一个Web框架. 为什么不选择一个现成的Web框架而是自己从头开发呢?我们来考察一下现有的流行的Web框架: Django:一站式开发框架,但不利于定制化: web ...
- python vars name报错_简单瞅瞅Python vars()内置函数的实现
0.偶然间看到一个奇怪的现象 >>> x = 1 >>> a = var() >>> a['x'] 1 这是啥操作??用help(vars)之后, ...
- python字符串前面加上序号_简单了解python字符串前面加r,u的含义
这篇文章主要介绍了简单了解python字符串前面加r,u的含义,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 u/U:表示unicode字符串 不是 ...
- python人脸识别系统下载_简单的Python人脸识别系统
案例一 导入图片 思路: 1.导入库 2.加载图片 3.创建窗口 4.显示图片 5.暂停窗口 6.关闭窗口 # 1.导入库 import cv2 # 2.加载图片 img = cv2.imread(' ...
- python协同过滤调用包_简单的python协同过滤程序实例代码
本文研究的主要是python协同过滤程序的相关内容,具体介绍如下. 关于协同过滤的一个最经典的例子就是看电影,有时候不知道哪一部电影是我们喜欢的或者评分比较高的,那么通常的做法就是问问周围的朋友,看看 ...
- python编程中条件句_简单讲解Python编程中namedtuple类的用法
Python的Collections模块提供了不少好用的数据容器类型,其中一个精品当属namedtuple. namedtuple能够用来创建类似于元祖的数据类型,除了能够用索引来访问数据,能够迭代, ...
最新文章
- R可视化包ggplot2更改背景色实战
- Spartan-6的BRAM(Block RAM)模块和DSP 模块XtremeDSP
- Design Pattern - Mediator(C#)
- VTK:Filtering之Glyph3D
- 期权价格的上限和下限
- linux php c 扩展,linux php添加扩展库
- axios学习笔记(二):轻松弄懂XHR的使用及如何封装简易axios
- tensorflow3
- 项目管理修炼之道之估算工作
- npm的常用配置项---npm工作笔记004
- Naïve UI——一个 Vue 3 组件库
- UNIX网络编程——常用服务器模型总结
- Oracle PL SQL完全自学手册pdf
- 从中报危机看创业板:谁在兜售“上市经济”?
- newusers和chpasswd的用法
- CAPL如何组装自定义报文
- linux libpng dev,linux下实用图形库--libpng下载地址及说明
- 如何在 Python 中使用 Plotly 创建太阳系的 3D 模型 (教程含源码)
- 线程插队--Join方法
- matlab把句子分割成单词_将英语句子单个单词分割存储
热门文章
- 关于std::string 在 并发场景下 __grow_by_and_replace free was not allocated 的异常问题
- leetcode-402 移掉K位数组
- 057 Insert Interval 插入区间
- Chapter 2 Open Book——29
- OC基本数据存储方式
- mysql单表多timestamp的current_timestamp设置问题
- HDU2673-shǎ崽(水题)
- Google工作原理
- 同花顺的数据格式总览(转帖)
- 【C++】random随机数与【C++11】/rand()和srand()的用法