前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >浅谈面向对象

浅谈面向对象

作者头像
小闫同学啊
发布2019-07-18 15:06:56
4620
发布2019-07-18 15:06:56
举报
文章被收录于专栏:小闫笔记小闫笔记

正文共:3429 字 5 图 预计阅读时间: 9 分钟

每日分享

Whenever you are confronted with an opponent, conquer them with love.

无论何时面对你的对手,都要用爱征服他。

小闫语录

孙子曰『凡用兵之法,全国为上,破国次之;全军为上,破军次之;全旅为上,破旅次之;全卒为上,破卒次之;全伍为上,破伍次之。是故百战百胜,非善之善者也;不战而屈人之兵,善之善者也。』

晓之以理,动之以情,智取以让敌方臣服者,大智慧也。武力破之,身降而心不降,是祸也。

浅谈面向对象

1.面向对象

面向对象编程OOP,很多人都是丈二的和尚,摸不着头脑。现在并没有一个统一的概念,导致面向对象也变成了只可意会不可言传,让很多人望尘莫及。

其实面向对象很简单,它就是为了提高代码的复用性而设计。我们在刚进入游戏的时候,肯定会有选择人物形象这一步,你喜欢女生,你会给它穿个裙子,她喜欢男生,她给他设置八块腹肌.....最初始的模型就是一个类,我们通过穿衣服,选择发型之类的操作,创建出来的人物就是对象。

总结一下,类是抽象出来的一些笼统的框架,对象通过类创建出来,并且可以为其设置属性。

面向过程编程时,我们会按照逻辑将所有的步骤都实现出来,而面向对象不需要关注过程怎么实现,我们直接通过类创建对象就好。

举个小栗子,假如你喜欢吃肯德基的奥尔良鸡腿堡。

面向过程就是你去后厨问师傅奥尔良鸡腿堡怎么做(当然人家不会告诉你,如果你家里有矿的话就开一家肯德基,然后你就有配方了,哈哈哈哈.....假装你有配方了),然后你买原材料自己动手做,好不容易做好了,两天过去了,饿死了。卒,享年24岁。

面向对象就是你去肯德基花26块钱买了一个奥尔良鸡腿堡,吃完了,很开心。

2.类

类有新式类和旧式类的区分,现在我们统一采用新式类。从名字你也晓得旧式类out了。

旧式类:

代码语言:javascript
复制
class Kfc:
    pass
或者
class Kfc():
    pass

新式类:

代码语言:javascript
复制
class Kfc(object):
    def orlean:
        print("奥尔良鸡腿堡制作完成")

你也许会想:小编,KFC你写错了,别欺负我没读过书......这正是我要说的,只是为了让大家明白类名我们采用大驼峰的命名方法。 大驼峰式命名法(upper camel case): 每一个单词的首字母都采用大写字母,例如:FirstName、LastName 还要知道一点,Python的命令规则遵循PEP8标准。

3.一些魔法方法

__str__:这个方法代表的是当你print一个通过类创建出来的对象时,打印出的是这个魔法方法的返回值。(所以 __str__需要return一个数据)

__del__:这个方法类比 __init__,当创建对象后,python解释器默认调用 __init__方法,当删除对象时,python解释器也会默认调用 __del__方法。

__new__:其实 __init__方法不是第一个调用的方法, __new__才是,类就是通过这个方法创建的对象。正因为它要创建对象,所以它必须有返回值。

1. __new__至少要有一个参数cls,代表要实例化的类,此参数在实例化时由Python解释器自动提供。 2. __new__必须要有返回值,返回实例化出来的实例,这点在自己实现 __new__时要特别注意,可以return父类 __new__出来的实例,或者直接是object的 __new__出来的实例。 3. __init__有一个参数self,就是这个 __new__返回的实例, __init____new__的基础上可以完成一些其它初始化的动作, __init__不需要返回值。 4.我们可以将 ‘类’ 比作制造商, __new__方法就是前期的原材料购买环节, __init__方法就是在有原材料的基础上,加工,初始化商品环节。

__doc__:文档字符串,是文件中的特殊注释。

__module__:查看当前成员属于哪个模块。

__class__:查看对象属于哪个类。

__bases__:查看本类的父类有哪些。

__mro__:查看类中方法的查找顺序。

__dict__:保存了类或对象中的成员信息。

类中的 __dict__属性保存了类的所属模块,类中全局变量,方法,DocString 等内容。 对象中的 __dict__属性 用来保存对象的属性。

__call__:通过实现了此方法的类创建出来的对象就可以被调用。

3.1单例模式

单例模式是一种常用的设计模式,它能保证某一个类只有一个实例对象。为什么要这样做呢?因为可以节省空间啊。同样的一个东西,内存里保存好几份,浪费不浪费~~~

那么下面实现一个单例模式:

代码语言:javascript
复制
class Kfc(object):
    __instance = None
    def __new__(cls,age,name):
        # 如果类属性__instance的值为None,
        # 那么就创建一个对象,并且赋值为这个对象的引用,保证下次调用这个方法时
        # 能够知道之前已经创建过对象了,这样就保证了只有1个对象 
        if not cls.__instance:
            cls.__instance = object.__new__(cls)
        return cls.__instnce

4.面向对象的三个基本特征

4.1封装

封装就是将重复的逻辑抽象成一个类。

意义

1.将属性和方法放到一起做为一个整体,然后通过实例化对象来处理;

2.隐藏内部实现细节,只需要和对象及其属性和方法交互就可以了;

3.对类的属性和方法增加 访问权限控制。

4.2继承

继承超重要,就是子类可以继承父类的一些方法。(就好像儿子继承父亲的五毛钱财产一样。)

4.2.1子类调用父类的同名方法
代码语言:javascript
复制
# 方式1. 指定执行父类的方法(代码臃肿)
School.__init__(self)
School.make_cake(self)
# 方法2. super() 带参数版本,只支持新式类
super(Prentice, self).__init__() # 执行父类的 __init__方法 
super(Prentice, self).make_cake()
# 方法3. super()的简化版,只支持新式类
super().__init__()  # 执行父类的 __init__方法 
super().make_cake()  # 执行父类的 实例方法

代码语言:javascript
复制
父类是 School
子类是 Prentice
父类方法是 make_cake()

1.子类继承了多个父类,如果父类类名修改了,那么子类也要涉及多次修改。而且需要重复写多次调用,显得代码臃肿。

2.使用super() 可以逐一调用所有的父类方法,并且只执行一次。调用顺序遵循 __mro__ 类属性的顺序。

注意:如果继承了多个父类,且父类都有同名方法,则默认只执行第一个父类的(同名方法只执行一次,目前super()不支持执行多个父类的同名方法)

3.super() 在Python2.3之后才有的机制,用于通常单继承的多层继承。

4.3多态

多态:定义时的类型和运行时的类型不一样,此时就称为多态,多态的概念是应用于Java和C#这一类强类型语言中,而Python崇尚“鸭子类型”。

鸭子类型:虽然我想要一只"鸭子",但是你给了我一只鸟。只要这只鸟走路像鸭子,叫起来像鸭子,游泳也像鸭子,我就认为这是鸭子。

Python的多态,就是弱化类型,重点在于对象参数是否有指定的属性和方法,如果有就认定合适,而不关心对象的类型是否正确。

下面使用代码说一下什么是多态:

代码语言:javascript
复制
class F1(object):
    def show(self):
        print('F1.show')

class S1(F1):
    def show(self):
        print('S1.show')

class S2(F1):
    def show(self):
        print('S2.show')

def Func(obj):  
    # python是弱类型,即无论传递过来的是什么,obj变量都能够指向它,这也就没有所谓的多态了(弱化了这个概念)
    print(obj.show())

s1_obj = S1()
Func(s1_obj) 

s2_obj = S2()
Func(s2_obj)

优质文章推荐:

公众号使用指南

redis操作命令总结

前端中那些让你头疼的英文单词

Flask框架重点知识总结回顾

项目重点知识点详解

难点理解&面试题问答

flask框架中的一些常见问题

团队开发注意事项

浅谈密码加密

Django框架中的英文单词

Django中数据库的相关操作

DRF框架中的英文单词

重点内容回顾-DRF

Django相关知识点回顾

美多商城项目导航帖

项目重要技术点介绍

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-03-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 全栈技术精选 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 每日分享
  • 浅谈面向对象
    • 1.面向对象
      • 2.类
        • 3.一些魔法方法
          • 3.1单例模式
        • 4.面向对象的三个基本特征
          • 4.1封装
          • 4.2继承
          • 4.3多态
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档