前言:

对象是模拟真实世界,把数据和程序进行封装 。

对象 = 属性+ 方法

我们需要用类来创造一个对象,就像我们要用图纸来造房子一样。在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的类和对象相关推荐

  1. python函数分几种_简单了解Python中的几种函数

    python是支持多种范型的语言,可以进行所谓函数式编程,其突出体现在有这么几个函数: filter.map.reduce.lambda.yield lambda lambda函数的使用方法:在lam ...

  2. python编写接口自动化脚本_简单的python http接口自动化脚本

    摘抄:今天给大家分享一个简单的python脚本,使用python进行http的接口测试,脚本很简单,逻辑是:读取excel写好的测试用例,然后根据excel中的用例内容进行调用,判断预期结果中的返回值 ...

  3. [转载] python中的且语句_简单探讨python中的语句和语法

    参考链接: 在Python中解包:并行分配之外 python程序结构 python"一切皆对象",这是接触python听到最多的总结了.在python中最基层的单位应该就是对象了, ...

  4. python程序框架的描述_简单介绍Python下自己编写web框架的一些要点

    在正式开始Web开发前,我们需要编写一个Web框架. 为什么不选择一个现成的Web框架而是自己从头开发呢?我们来考察一下现有的流行的Web框架: Django:一站式开发框架,但不利于定制化: web ...

  5. python vars name报错_简单瞅瞅Python vars()内置函数的实现

    0.偶然间看到一个奇怪的现象 >>> x = 1 >>> a = var() >>> a['x'] 1 这是啥操作??用help(vars)之后, ...

  6. python字符串前面加上序号_简单了解python字符串前面加r,u的含义

    这篇文章主要介绍了简单了解python字符串前面加r,u的含义,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 u/U:表示unicode字符串 不是 ...

  7. python人脸识别系统下载_简单的Python人脸识别系统

    案例一 导入图片 思路: 1.导入库 2.加载图片 3.创建窗口 4.显示图片 5.暂停窗口 6.关闭窗口 # 1.导入库 import cv2 # 2.加载图片 img = cv2.imread(' ...

  8. python协同过滤调用包_简单的python协同过滤程序实例代码

    本文研究的主要是python协同过滤程序的相关内容,具体介绍如下. 关于协同过滤的一个最经典的例子就是看电影,有时候不知道哪一部电影是我们喜欢的或者评分比较高的,那么通常的做法就是问问周围的朋友,看看 ...

  9. python编程中条件句_简单讲解Python编程中namedtuple类的用法

    Python的Collections模块提供了不少好用的数据容器类型,其中一个精品当属namedtuple. namedtuple能够用来创建类似于元祖的数据类型,除了能够用索引来访问数据,能够迭代, ...

最新文章

  1. R可视化包ggplot2更改背景色实战
  2. Spartan-6的BRAM(Block RAM)模块和DSP 模块XtremeDSP
  3. Design Pattern - Mediator(C#)
  4. VTK:Filtering之Glyph3D
  5. 期权价格的上限和下限
  6. linux php c 扩展,linux php添加扩展库
  7. axios学习笔记(二):轻松弄懂XHR的使用及如何封装简易axios
  8. tensorflow3
  9. 项目管理修炼之道之估算工作
  10. npm的常用配置项---npm工作笔记004
  11. Naïve UI——一个 Vue 3 组件库
  12. UNIX网络编程——常用服务器模型总结
  13. Oracle PL SQL完全自学手册pdf
  14. 从中报危机看创业板:谁在兜售“上市经济”?
  15. newusers和chpasswd的用法
  16. CAPL如何组装自定义报文
  17. linux libpng dev,linux下实用图形库--libpng下载地址及说明
  18. 如何在 Python 中使用 Plotly 创建太阳系的 3D 模型 (教程含源码)
  19. 线程插队--Join方法
  20. matlab把句子分割成单词_将英语句子单个单词分割存储

热门文章

  1. 关于std::string 在 并发场景下 __grow_by_and_replace free was not allocated 的异常问题
  2. leetcode-402 移掉K位数组
  3. 057 Insert Interval 插入区间
  4. Chapter 2 Open Book——29
  5. OC基本数据存储方式
  6. mysql单表多timestamp的current_timestamp设置问题
  7. HDU2673-shǎ崽(水题)
  8. Google工作原理
  9. 同花顺的数据格式总览(转帖)
  10. 【C++】random随机数与【C++11】/rand()和srand()的用法