创建类和对象

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

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

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

  

  • 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. django 使用post方法出现403错误的解决办法

    当采用客户端象django的服务器提交post请求时.会得到403,权限异常.因为django针对提交的请教,有校验.所以会如此. 解决办法: 导入模块:from django.views.decor ...

  2. JS - caller,callee,call,apply

    在提到上述的概念之前,首先想说说javascript中函数的隐含参数:arguments Arguments : 该对象代表正在执行的函数和调用它的函数的参数. [function.]argument ...

  3. 在sql结果中显示行号

    1.准备 create table newtable ( name ), ) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; ); ); ); ); ); 2.实现 ) a ...

  4. 网页打开新窗口——Window.open()详解

    转载自:http://blog.csdn.net/business122/article/details/8281142 Window.Open详解 一.window.open()支持环境:JavaS ...

  5. 开启Visual Studio 2013时,出现Microsoft.VisualStudio.Web.PasteJson.JsonPackage无法载入的可能解決方案

    1.先下载:http://www.jb51.net/dll/Microsoft.VisualStudio.Web.PasteJson.dll.html Microsoft.VisualStudio.W ...

  6. IOS让返回按钮显示自定义标题而不是上个ViewController的title

    在开发IOS的时候发现当从一个ViewController跳转到另一个ViewController时,被跳转到的那个ViewController的返回按钮总是显示的是上个ViewController的 ...

  7. CSS3 实现厉害的文字和输入框组合效果

    最近在忙着弄网站,学到了不少效果,这又是一个厉害的  <html> <head> <meta http-equiv="Content-Type" co ...

  8. Linux Shell Vim 经常使用命令、使用技巧总结

    前言 本文总结了自己实际开发中的经常使用命令,不定时更新,方便自己和其它人查阅. 如有其它提高效率的使用技巧.欢迎留言. 本文地址 http://blog.csdn.net/never_cxb/art ...

  9. Android——4.2.2 源代码文件夹结构分析

    近期公司要整android内部培训,分配给我写个培训文档.这里记录例如以下: 撰写不易,转载请注明出处:http://blog.csdn.net/jscese/article/details/4089 ...

  10. Struts2_day02--封装数据到集合里面

    封装数据到集合里面 封装数据到List集合 第一步 在action声明List 第二步 生成list变量的set和get方法 第三步 在表单输入项里面写表达式 封装数据到Map集合 第一步 声明map ...