面向过程的编程

  面向过程,核心是过程二字,过程指的是解决问题的步骤,设计一条流水线,机械式的思维方式

  优点:复杂的问题流程化,进而简单化。

  缺点:可扩展性差

面向对象的编程

  面向对象,核心是对象二字,对象就是特征与技能的结合体。

  优点:可扩展性强

  缺点:变成复杂性高

   应用场景:用户需求经常变化,互联网应用,游戏,企业内部应用(办公系统等)

定义类与实例化出对象

  类就是一系列对象相似的特征与技能的结合体。

  强调:站在不同的角度,得到的分类是不一样的。

 

  在现实世界中:一定先有对象,后由类

  在程序中:一定是先定义类,后调用类产生对象

 

  站在路飞学院角度,大家都是学生

在现实世界中:
    对象1:王二丫
        特征:
            学校='luffycity'
            名字='王二丫'
            性别='女'
            年龄=18
        技能:
            学习
            吃饭
            睡觉
    对象2:李三炮
        特征:
            学校='luffycity'
            名字='李三炮'
            性别='男'
            年龄=38
        技能:
            学习
            吃饭
            睡觉
    对象3:张铁蛋
        特征:
            学校='luffycity'
            名字='张铁蛋'
            性别='男'
            年龄=48
        技能:
            学习
            吃饭
            睡觉
    
    总结现实中路飞学院的学生类
        相似的特征
            学校='lluffycity'
        相似的技能
            学习
            吃饭
            睡觉
# 先定义类
class LuffyStudent:
    school = 'luffycity'

             # stu1, '王二丫', '女', 18
    def __init__(self, name, sex, age):
        self.Name = name
        self.Sex = sex
        self.Age = age

        #stu1.Name = '王二丫'
        #stu1.Sex = '女'
        #stu1.Age = 18

    def learn(self, x):
        print('%s is learning %s.' % (self.Name, x))

    def eat(self):
        print('is eating.')

    def sleep(self):
        print('is sleeping.')

# 后产生对象
stu1 = LuffyStudent('王二丫', '', 18)

# 加上__init__方法后,实例化步骤
# 1、先产生一个空对象 stu1
# 2、LuffyStudent.__init__('王二丫', '女', 18)

#
stu1.class_name = 'python开发'
print(stu1.__dict__)

#
del stu1.Name
print(stu1.Name)

#
stu1.Name = '李二丫'
print(stu1.__dict__)
print(stu1.Name)

#
print(stu1.__dict__)
print(stu1.Name)
print(stu1.Sex)
print(stu1.Age)

stu2 = LuffyStudent('李三炮', '', 38)  # Luffycity.__init(...)
stu3 = LuffyStudent('张铁蛋', '', 48)

# 对象:特征与技能的结合体
# 类:类是一系列对象相似的特征与相似技能的结合体
# 类中的数据属性:是所有对象共有的
print(LuffyStudent.school, id(LuffyStudent.school))
print(stu1.school, id(stu1.school))
print(stu2.school, id(stu2.school))
print(stu3.school, id(stu3.school))

# 类中的函数属性:是绑定给对象使用的,绑定到不同的对象是不同的绑定方法,对象调用绑定方法时会把对象本身当作第一个参数传入,传给self
print(LuffyStudent.learn)
LuffyStudent.learn(stu1)
print(stu1.learn)
print(stu2.learn)

stu1.learn(1)  # LuffyStudent.learn(stu1,1)

# 先从对象自己里面找,找不到就去类里面找(类没有就不断地去他的父类里面找),找不到就报错,不去全局里面查找
stu1.x = 'from stu1'
LuffyStudent.x = 'from luffycity class'

 补充:

  • 站的角度不同,定义出的类是截然不同的;
  • 现实中的类并不完全等于程序中的类,比如现实中的公司类,在程序中有时需要拆分成部门类,业务类等;
  • 有时为了编程需求,程序中也可能会定义现实中不存在的类,比如策略类,现实中并不存在,但是在程序中却是一个很常见的类。
# python一切皆对象,在python3里统一类与类型的概念
l = [1, 2, 3]  # l = list([1,2,3])
l.append(4)  # list.append(l1,4)

面向对象可扩展性总结test

# 练习1:编写一个学生类,产生一堆学生对象,(5分钟)
# 要求:有一个计数器(属性),统计总共实例了多少对象

class Student:
    school = 'Luffycity'
    count = 0

    def __init__(self, name, age, sex):
        self.Name = name
        self.Age = age
        self.Sex = sex
        # self.count += 1
        Student.count += 1

    def learn(self):
        print('%s is learning.'%self.name)

print(Student.count)

stu1 = Student('alex', 'male', 38)
print(stu1.count)

stu2 = Student('jinxing', 'female', 78)
print(stu2.count)

stu3 = Student('egon', 'male', 18)
print(stu3.count)


'''练习2:模拟LoL定义两个英雄类,(10分钟)
要求:
英雄要有昵称、攻击力、生命值等属性
实例化出两个英雄对象
英雄之间可以互殴,被殴打的一方掉血,血量小于0则判定死亡
'''

class Garen:
    camp = 'Demacia'

    def __init__(self, nickname, life_value, aggressivity):
        self.nickname = nickname
        self.life_value = life_value
        self.aggressivity = aggressivity

    def attack(self, enemy):
        enemy.life_value -= self.aggressivity

class Riven:
    camp = 'Noxus'

    def __init__(self, nickname, life_value, aggressivity):
        self.nickname = nickname
        self.life_value = life_value
        self.aggressivity = aggressivity

    def attack(self, enemy):
        enemy.life_value -= self.aggressivity

g1 = Garen('草丛伦', 100, 30)
r1 = Riven('可爱的锐雯雯', 80, 50)

print(r1.life_value)
g1.attack(r1)
print(r1.life_value)