创建类和对象

  刚开始我们接触得多的编程方式为面向过程编程,这种方式就是根据业务逻辑从上往下垒代码,后来又出现了函数式编程,就是为了提高代码的重用性,减轻程序猿的工作量--而今天我们即将学的

  面向对象编程则是使用类和对象来实现的,类就是一个模板,模板里可以包含多个函数,函数里实现一些功能

  对象则是根据模板创建的实例,通过实例对象可以执行类中的函数

  

  • class是关键字,表示类
  • 创建对象--类名称后加括号
#创建类
class foo: def bar(self):
print('bar') def hello(self,name):
print('i am %s'%name) #根据类foo创建对象ohj
obj = foo()
obj.bar() #执行bar方法
obj.hello('alex') #执行hello函数

  那你可能会想:这样做好像并不比函数编程简便??

  • 面向对象--创建对象,通过对象执行方法,看得出在方法执行上有个权限,只有对象才有这个权限
  • 函数编程:只用调用就可,可以说没有权限,无论谁叫都到
  • 结论:函数式的应用场景,各个函数之间是独立且无共用的数据

面向对象三大特性

  面向对象有三大神奇功能:封装,继承,多态

一、封装

  封装--好理解,从字面意思理解,把什么玩意封在某个地方,好比:人的五脏六腑封装在人的体内样的,所以封装特性表现为:

  • 将内容封装到某处
  • 从某处调用被封装的内容

第一个表现--将内容封装到某处

第二个表现:从某处调用被封装的内容

  • 通过对象直接调用
  • 通过self间接调用

  好,封装就是这样,封装了某些属性到对象,然后可以用对象直接调用,或self间接调用,简单吧

二、继承

  继承--和生活中的继承是一样一样的,即:子可以继承父的技能

  举个列子:

      猫可以:喵喵叫、吃喝拉撒

      狗可以:汪汪叫、吃喝拉撒

  我们可以很明显的发现,狗和猫都会吃喝拉撒,不仅狗和猫会,是个动物都会,如果如要分别写这个两个类,吃喝拉撒是不是就要写两遍了,那继承的特性就是为了在这方面方便我们的

class animal:

    def eat(self):
print('%s吃'%self.name)
def drink(self):
print('%s喝'%self.name)
def shit(self):
print('%s拉'%self.name)
def pee(self):
print('%s撒'%self.name) #在类后面括号中写入另外一个类名,表示当前类继承另外一个类
class cat(animal): def __init__(self,name):
self.name = name
self.breed = '猫'
def cry(self):
print('喵喵叫') class dog(animal): def __init__(self,name):
self.name = name
self.breed = '狗'
def cry(self):
print('汪汪叫') c1 = cat('小白家的小黑猫')
c1.eat() d1 = dog('胖子家的小瘦狗')
d1.drink()

  所以,对于面向对象的继承来说,其实就是将多个类共有的方法提取到父类中,子类仅需继承父类而不必一一实现每个方法,另外除了父类和子类的称谓,还可以叫基类和派生类

  那疑问又来了,是否可以继承多个类?如果遇到继承的多个类中都定义了相同的函数,那么会执行哪个呢?

  1、Python的类可以继承多个类,Java和C#中则只能继承一个类

  2、Python的类如果继承了多个类,那么其寻找方法的方式有两种,分别是:深度优先广度优先

  • 当类是经典类时,多继承情况下,会按照深度优先方式查找
  • 当类是新式类时,多继承情况下,会按照广度优先方式查找

经典类和新式类,从字面上可以看出一个老一个新,新的必然包含了跟多的功能,也是之后推荐的写法,从写法上区分的话,如果 当前类或者父类继承了object类,那么该类便是新式类,否则便是经典类。

 

#多继承

#经典类
class classmate():
def __init__(self,name):
self.name = name
def eat(self):
print('%s is eating.'%self.name)
def drink(self):
print('%s is drinking.'%self.name) #派生类1:
class female(classmate):
def drink(self):
print('%s drink orange juice'%self.name) #派生类2:
class male(classmate):
def drink(self):
print('%s is drink alcohol'%self.name) class pythoner(classmate):
def occuption(self):
print('%s is a pythoner.'%self.name) class fe_pythoner(pythoner,female):
pass
class ma_pythoner(pythoner,male):
pass eva = fe_pythoner('eva')
eva.drink() sweet = ma_pythoner('sweet')
sweet.drink() #新生类 class classmate(object):
def __init__(self,name):
self.name = name
def eat(self):
print('%s is eating.'%self.name)
def drink(self):
print('%s is drinking.'%self.name) class female(classmate):
def drink(self):
print('%s drink orange juice.'%self.name)
class male(classmate):
def drink(self):
print('%s drink alcohol.'%self.name)
class pythoner(classmate):
def occupation(self):
print('%s is a pythoner.'%self.name) class fe_pythoner(pythoner,female):
pass
class ma_pythoner(pythoner,male):
pass
eva = fe_pythoner('eva')
eva.drink() sweet = ma_pythoner('sweet')
sweet.drink()
#结论:在python3中,类的继承默认就是广度优先
# 在python2中,经典类多继承,按照深度优先查找,新式类多继承按广度优先查找

  另外子类继承父类的构造方法:

class fund(object):

    def __init__(self,fund_type,fund_name):
self.fund_type = fund_type
self.fund_name = fund_name def chao(self):
pass class index_fund(fund):
def __init__(self,fund_type,fund_name,nav):
super(index_fund,self).__init__(fund_type,fund_name)
self.nav = nav def cao(self):
pass
def prin(self):
print('{} is {},now jingzhi is {}'.format(self.fund_name,self.fund_type,self.nav)) obj1 = index_fund('指数型基金','富国中证500',2.2)
obj1.prin()

三、多态 

   Pyhon不支持多态并且也用不到多态,多态的概念是应用于Java和C#这一类强类型语言中,而Python崇尚“鸭子类型”。

class F1:
pass class S1(F1): def show(self):
print 'S1.show' class S2(F1): def show(self):
print 'S2.show' # 由于在Java或C#中定义函数参数时,必须指定参数的类型
# 为了让Func函数既可以执行S1对象的show方法,又可以执行S2对象的show方法,所以,定义了一个S1和S2类的父类
# 而实际传入的参数是:S1对象和S2对象 def Func(F1 obj):
"""Func函数需要接收一个F1类型或者F1子类的类型""" print obj.show() s1_obj = S1()
Func(s1_obj) # 在Func函数中传入S1类的对象 s1_obj,执行 S1 的show方法,结果:S1.show s2_obj = S2()
Func(s2_obj) # 在Func函数中传入Ss类的对象 ss_obj,执行 Ss 的show方法,结果:S2.show
class F1:
pass class S1(F1): def show(self):
print 'S1.show' class S2(F1): def show(self):
print 'S2.show' def Func(obj):
print obj.show() s1_obj = S1()
Func(s1_obj) s2_obj = S2()
Func(s2_obj)

类和对象在内存中的存储原理

  类以及类中的方法在内存中只有一份,而根据类创建的每一个对象都在内存中需要存一份

如上图所示,根据类创建对象时,对象中除了封装 name 和 age 的值之外,还会保存一个类对象指针,该值指向当前对象的类。

当通过 obj1 执行 【方法一】 时,过程如下:

    1. 根据当前对象中的 类对象指针 找到类中的方法
    2. 将对象 obj1 当作参数传给 方法的第一个参数 self

欢迎大家对我的博客内容提出质疑和提问!谢谢

                                                                             笔者:拍省先生  

 

python基础-第七篇-7.1初识类和对象的更多相关文章

  1. python基础-第七篇-7.2面向对象(进阶篇)

    进入到今天的探索前,我先对上节内容进行一下回顾: 面向对象是一种编程方式,此编程方式的实现是基于对类和对象的使用 类是一个模板,模板中包装了多个函数可供使用 对象是基于类创建的,实例用于调用被包装在类 ...

  2. Java核心基础第5篇-Java面向对象_类和对象

    Java面向对象之类和对象 一.面向对象概述 Java是完全的面向对象编程(Object Oriented Programming),简称OOP. 面向对象编程的思维方式更加符合大家的日常生活,因为我 ...

  3. python基础-第七篇-7.4异常处理

    异常基础: 异常处理首先要捕获异常,不让程序中断,也不让错误信息直接呈现出来,然后就是你该怎么处理异常,以什么方式显示 try: pass except Exception,ex: pass 在需要用 ...

  4. python基础-第八篇-8.1初识Socket

    socket基础 socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求. so ...

  5. python基础-第七篇-7.3反射

    定义 反射是根据字符串的形式去对操作其成员 了解反射前,我先看看内置方法__import__,还记得这个内置方法吗? __import__  用于以字符串的形式导入模块 inp = input('请输 ...

  6. 【Python基础】lpthw - Exercise 40 模块、类和对象

    一. 模块(module) 模块中包含一些函数和变量,在其他程序中使用该模块的内容时,需要先将模块import进去,再使用.操作符获取函数或变量,如 # This goes in mystuff.py ...

  7. 学习java随笔第七篇:java的类与对象

    类 同一个包(同一个目录),类的创建与调用 class Man{ String name; void GetMyName() { System.out.println(name); } } publi ...

  8. Python开发【第二篇】:初识Python

    Python开发[第二篇]:初识Python   Python简介 Python前世今生 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏 ...

  9. Python初识类与对象

    Python初识类与对象 类与对象 世界观角度分析类与对象 类是一个抽象的概念,而对象是一个实体的存在,对象由类创造而出,每个对象之间互相独立互不影响,一个对象可以同时拥有多个类的方法,实例化就是通过 ...

随机推荐

  1. 使用libjpeg 压缩yuv420到jpg (内存方式)

    #include <Windows.h> #include <stdio.h> extern "C" { #include <jpeglib.h> ...

  2. Makefile 10——打造更专业的编译环境-huge项目

    先手工创建几个文件目录: 接下来先创建code/foo/src目录下的Makefile: .PHONY: all clean MKDIR = mkdir RM = rm RMFLAGS = -rf C ...

  3. ftok函数例子

    #include <stdio.h>#include <sys/types.h>#include <sys/ipc.h>int main( void ){ int ...

  4. 如何解决PHP里大量数据循环时内存耗尽的问题

    最近在开发一个PHP程序时遇到了下面的错误: PHP Fatal error: Allowed memory size of 268 435 456 bytes exhausted 错误信息显示允许的 ...

  5. git error Another git process seems to be running in this repository

    How to fix error Another git process seems to be running in this repository When you use Git, you se ...

  6. 【BZOJ】1649: [Usaco2006 Dec]Cow Roller Coaster(dp)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1649 又是题解... 设f[i][j]表示费用i长度j得到的最大乐趣 f[i][end[a]]=ma ...

  7. nginx报403错误的2种原因

  8. Mac 文件读写权限问题 OSError: Operation not permitted

    Mac在OS X 10.11以后加入了Rootless功能,主要是限制了root权限,阻止用户对部分路径下的目录进行更改.受到限制的有以下目录: /System /bin /sbin /usr (ex ...

  9. hdu 1392:Surround the Trees(计算几何,求凸包周长)

    Surround the Trees Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Other ...

  10. python虚拟环境的使用---virtualenv and virtualenvwrapper

    虚拟环境 virtualenv 常用操作 step1: 安装 : pip install virtualenv step2:新建 : virtualenv venv cd venv activate ...