python -- 面向对象OOP object oriented programming

python -- 面向对象OOP object oriented programming

面向对象的前戏 -- 1

以下定义了4个函数,其中2两个是角色用,2个是角色拥有的技能。

但是问题来了。

原本两个技能不能互换的,由于这4个都是函数,所以可以互换!!!逆天了!!!

def make_human(name, age, sex):
    # 在字典里加入type的key是为了可以判断这个数据是人还是狗?

    human = {'name':name,
             'age':age,
             'sex':sex,
             'type':'human'}

    return human


def make_dog(name, age, sex, type):
    # 在字典里加入type的key是为了可以判断这个数据是人还是狗?

    dog = {'name':name,
             'age':age,
             'sex':sex,
             'dog_type':type,
             'type':'dog'}

    return dog


def walk(human):
    word = '{0} is walking so fast... ...'.format(human['name'])
    return word


def rush(dog):
    word = '{0} is rush somebody... ...'.format(dog['name'])
    return word


human_1 = make_human('沙和尚',40, '男')

dog_1 = make_dog('哮天犬',10,'不详','藏獒')


print(walk(human_1))
print(rush(dog_1))

'''
以下是结果:
沙和尚 is walking so fast... ...
哮天犬 is rush somebody... ...
'''

为了做到不逆天的效果,将上面的代码改写,使技能回归到角色内,代码如下:

def make_human(name, age, sex):
    # 再字典里加入type的key值是在于,可以判断这个数据是人还是狗?

    def walk(human):
        print('{0} is walking so fast... ...'.format(human['name']))

    human = {'name':name,
             'age':age,
             'sex':sex,
             'walk':walk,  # 这里讲上面定义的walk函数变成了内存地址传入
             'type':'human'}

    return human


def make_dog(name, age, sex, type):
    # 再字典里加入type的key值是在于,可以判断这个数据是人还是狗?

    def rush(dog):
        print('{0} is rush somebody... ...'.format(dog['name']))

    dog = {'name':name,
             'age':age,
             'sex':sex,
             'dog_type':type,
             'rush':rush,  # 这里讲上面定义的rush函数变成了内存地址传入
             'type':'dog'}

    return dog


human_1 = make_human('沙和尚',40, '男')

dog_1 = make_dog('哮天犬',10,'不详','藏獒')


dog_1['rush'](dog_1)  # 这样使用是在调用内存地址,由于rush这个函数是需要形参,所以还要将dog_1传入
human_1['walk'](human_1)

'''
以下是结果:
哮天犬 is rush somebody... ...
沙和尚 is walking so fast... ...
'''

这样写可以将技能回归到角色本身,但是从代码的行数,还有代码的可扩展性角度看,就有带改进的地方。

面向对象的前戏 -- 2

以下是摘录Alex的笔记

编程范式

编程是程序员用特定的语法 + 数据结构 + 算法组成的代码来告诉计算机如何执行任务的过程,一个程序是程序员为了得到一个任务结果而编写的一组指令的集合,正所谓条条大路通罗马,实现一个任务的方式有很多种不同的方式, 对这些不同的编程方式的特点进行归纳总结得出来的编程方式类别,即为编程范式。

不同的编程范式本质上代表对各种类型的任务采取的不同的解决问题的思路, 大多数语言只支持一种编程范式,当然也有些语言可以同时支持多种编程范式。

两种最重要的编程范式分别是[面向过程编程]和[面向对象编程]。

面向过程编程(Procedural Programming)

Procedural programming uses a list of instructions to tell the computer what to do step-by-step.
面向过程编程依赖 - 你猜到了- procedures,一个procedure包含一组要被进行计算的步骤, 面向过程又被称为top-down languages, 就是程序从上到下一步步执行,一步步从上到下,从头到尾的解决问题 。基本设计思路就是程序一开始是要着手解决一个大的问题,然后把一个大问题分解成很多个小问题或子过程,这些子过程再执行的过程再继续分解直到小问题足够简单到可以在一个小步骤范围内解决。

面向对象编程

OOP编程是利用“ 类 ”和“ 对象 ”来创建各种模型来实现对真实世界的描述,使用面向对象编程的原因一方面是因为它可以使程序的维护和扩展变得更简单,并且可以大大提高程序开发效率,另外,基于面向对象的程序可以使它人更加容易理解你的代码逻辑,从而使团队开发变得更从容。

面向对象的几个核心特性如下:

Class 类(就是模板,类似人或狗的那些函数)

一个类即是对一类拥有相同属性的对象的抽象、蓝图、原型。在类中定义了这些对象的都具备的属性(variables(data))、共同的方法(共同的功能)。

Object 对象

一个对象即是一个类的实例化后实例,一个类必须经过实例化后方可在程序中调用,一个类可以实例化多个对象,每个对象亦可以有不同的属性,就像人类是指所有人,每个人是指具体的对象,人与人之前有共性,亦有不同。

Encapsulation 封装

Inheritance 继承

Polymorphism 多态

武sir的解说

什么是面向对象?
用类和对象来实现功能。从函数过渡而来,

什么是类,什么是对象,有什么关系?
class类就是def函数的集合

class 类:
def 函数1:

def 函数2:

def 函数3:

obj=类()
obj.函数1()
obj就是对象,创建对象的过程就是实例化的过程。

什么时候使用面向对象
见一张图,上面是有关SSH的一段伪代码,但是写法比较简练,可能对FTP作业有帮助

  • 将公共的功能集中在类中,
  • 根据一个模板创建某些东西(人,狗的那种)
  • 如果很多函数间都需要传入多个
  • 相同的参数时,见另一个图

面向对象中的self就是当前调用方法的对象,即实例化后的对象。

首先实例化成对象,然后对象会通过指针的方法指向到类内部的方法或静态属性
类里的__init__ 里面写的就是普通字段[或普通属性]

共有属性[或静态字段],就是在class全局使用的,如果每一个对象都有一个共同的值,那就可以将这个值变成类的公有属性[或静态字段]

# 这个是一段伪代码, 没有实际意义,不过可以运行

class Foo:
    # 定义一个叫country的静态属性 / 共有属性
    country = 'China'
    
    def __init__(self, name, count):
        self.NAME = name
        self.COUNT = count
        
    def bar(self):
        pass
    
obj1 = Foo('上海', 100000)  # 实例化
obj2 = Foo('北京', 100000)
obj1.bar()  # 实例化使用类的方法
print(obj1.country)  # China
posted @ 2017-10-09 16:02  gzz041  阅读(287)  评论(0)    收藏  举报