面向对象介绍

面向对象介绍

'''
1.什么是面向对象?
  面向对象是一门编程思想!

  - 面向过程编程思想:
      核心是 “过程” 二字,过程指的是解决问题的步骤,即先干什么再干什么!
      基于该编程思想编写程序,就好比在设计一条工厂流水线,一种机械式的思维方式。

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

      缺点:
          牵一发而动全身,程序的可扩展性差。


  注意: 编程思想仅仅是一门思想,与任何的技术无关。

  - 面向对象编程思想:
      注意: 要将自己当做一个上帝!!!
      核心是 “对象” 二字,对象指的是 “特征与技能” 的结合体。
      基于该编程思想编写程序,就好比在创造世界,一种 “上帝式” 的思维方式。

      优点:
          可扩展性高。

      缺点:
          编写程序的复杂程度比面向过程高。

2.如何产生对象:
  1) 什么是类?
      类指的是类型、类别。

      - 在两种角度去看待:
          - 现实世界中:
              - 先有一个个的对象,经过社会的文明发展,随之总结出类。
              对象是实际存在的,而类抽象产生的。

          - 在程序中:
              - 必须先有类,再通过“调用类,产生对象”。

      对象指的是 “特征与技能” 的结合体, 类指的是一系列 “对象之间相同的特征与技能” 的结合体。


  2) 如何定义类:
      - 如何写类并产生对象:
          - 先从现实世界中通过一个个对象总结出类。
          - 然后再定义类,后调用类产生对象。


      - 比如: 选课系统:
          - 选课系统学生类:
              - 学生对象1:
                  特征:
                      - 姓名: 胡晨阳
                      - 性别: female
                      - 年龄: 95
                      - 学校: oldboy

                  - 技能:
                      - 技术: python
                      - 学习: learn
                      - 选课: course

              - 学生对象2:
                  特征:
                      - 姓名: 高弟
                      - 性别: female
                      - 年龄: 98
                      - 学校: oldboy

                  - 技能:
                      - 技术: python
                      - 学习: learn
                      - 选课: course


  3) 定义类语法:
      class 关键字: 帮你产生类的。

      class 类的名字:
          - 对象之间相同的特征
              - 学校
              school = 'oldboy'

          - 对象之间相同的技能
              - python
                  def python():
                      pass

              - learn
                  def learn():
                      pass

              - course
                  def course():
                      pass
'''

'''
class 类名:
  特征
  技能

定义类名的规范:
  - 驼峰命名法

'''


# def foo(): # 函数名指向的是函数的内存地址
#     pass


# print(foo) # <function foo at 0x000001CDFF119048>


# 定义老男孩学生类
class OldboyStudent:  # 类名指向的是类的内存地址
   # 学生相同的特征
   # 在类中的特征 也称之为 “属性” attribute
   school = 'oldboy'

   # 学生相同的技能
   # 注意: 在类内部定义函数,会默认有一个参数self
   def learn(self):  # self此时当做一个形参
       print('learning....')


print(OldboyStudent)  # <class '__main__.OldboyStudent'>

# 查看类的名称空间
print(OldboyStudent.__dict__)
print(OldboyStudent.__dict__['school'])
print(OldboyStudent.__dict__['learn'])
OldboyStudent.__dict__['learn'](123)


# 类提供一种特殊获取名字的方式 “类名.名字” 的方式
# # 查
# print(OldboyStudent.school)
# OldboyStudent.learn('tank')
#
# # 改
# OldboyStudent.school = 'OldGirl'
# print(OldboyStudent.school)

# 删
# del OldboyStudent.school

# 增
# OldboyStudent.school = 'Oldboy'
# print(OldboyStudent.school)
# OldboyStudent.old_student = 'HuChenYang'
# print(OldboyStudent.old_student)


'''
- 函数的名称空间:
  在调用函数时产生,函数调用结束后销毁。
   
- 类的名称空间:
  在定义阶段时产生,会将类中所有的名字,扔进类的名称空间中。
'''

对象

'''
对象的产生:
  - 调用类产生对象

  类名 + () 调用类产生对象

  类的名称空间在定义时产生,对象的名称空间在调用类时产生。

  调用类产生对象的过程称之为类的实例化,对象称之为类的一个实例。
'''


# class Student:
#     # 学校
#     school = 'oldboy'
#
#     # 学习技能   ----> method ---》 方法
#     def learn(self):
#         print(self) #
#         print('learning...')
#
#
# # stu1 = Student()
# # stu2 = Student()
# # stu3 = Student()
# # print(Student) #
# # print(Student.school, 'Student...')
# # print(Student.learn, 'Student...')
# # Student.learn(123)
# print('=' * 100)
#
# # print(stu1) # <__main__.Student object at 0x0000017BFF8A5898>
# # print(stu1.school, 'stu1...')
# print(stu1.learn, 'stu1...')
# # print(stu1)
# # 对象调用方法时: 会将对象当做第一个参数传入方法中。
# stu1.learn() #
#
# print('=' * 100)
# # print(stu2) # <__main__.Student object at 0x0000017BFF8A5898>
# # print(stu2.school, 'stu2...')
# print(stu2.learn, 'stu2...')
# stu2.learn()
#
# print('=' * 100)
# # print(stu3) # <__main__.Student object at 0x0000017BFF8A5898>
# # print(stu3.school, 'stu3...')
# print(stu3.learn, 'stu3...')
# stu3.learn()


'''
由对象来调用类内部的函数,称之为对象的绑定方法。
  对象的绑定方法特殊之处: 会将对象当做第一个参数传给该方法。
'''


class Student:
   # 学校
   school = 'oldboy'

   def __init__(self, name, sex, age):  # stu1, 'tank', 'male', 17
       print(self.__dict__)

       # 给对象添加新的属性
       self.name = name  # stu1.x = 'tank'
       self.sex = sex  # stu1.y = 'male'
       self.age = age  # stu1.z = 17

       # 查看当前对象的名称空间
       print(self.__dict__)

   # 学习技能   ----> method ---》 方法
   def learn(self):
       print(self)  #
       print('learning...')


# 查看类的名称空间
print(Student.__dict__)

# stu1 = Student() # Student(stu1) ---> __init__(self) ----> self == stu1
# stu2 = Student() # Student(stu2) ---> __init__(self) ----> self == stu2
# stu3 = Student() # Student(stu3) ---> __init__(self) ----> self == stu3

# stu1.name = '江鹏'
# stu1.sex = 'female'
# stu1.age = 84
# print(stu1.name, stu1.sex, stu1.age)
#
# print(stu1)
# print(stu2)
# print(stu3)


# **** 想要在调用类时,为对象传入对象独有 特征
# ***** __init__(self, name, sex, age): # name---> tank , sex---> male, age----> 17
# 调用类时: 会将对象当做第一个参数,与括号内所有的参数一并传给__init__()
# stu1 = Student('tank', 'male', 17)

# 注意: 凡是在类内部定义的,__开头或者__结尾的方法都有特殊的意义。
# 在类内部定义的方法,在调用类时触发,会自动将对象本身当做第一个参数自动传入, 与括号内所有的参数一并传给__init__()。
# __init__(self):

对象名字的查找顺序

'''
对象名字的查找顺序: *******
  1.对象.属性,会先找对象自己的。
  2.若对象没有,会去找类的。
  3.若类没有,则会报错。
'''


class People:
   country = 'China'
   name = 'jason'

   def __init__(self, name, age, sex):
       self.name = name
       self.age = age
       self.sex = sex

   def run(self):
       print('running...')


obj1 = People('tank', 17, 'male')
print(obj1.name)  # tank 找对象自己的name属性
print(obj1.country)  # China 对象没有,找类中的属性
# AttributeError: 'People' object has no attribute 'jason'
# print(obj1.jason) # 对象没有,类也没有,就会报错!
print(obj1.__dict__)
# 给对象的名称空间添加 country='中国' 属性
obj1.country = '中国'
print(obj1.__dict__)
print(People.__dict__)
print(obj1.country)

一切皆对象

'''
在python中一切皆对象。

'''


# class Foo:
#     def __init__(self, x, y, z):
#         self.x = x
#         self.y = y
#         self.z = z


# 产生对象
# 调用类产生对象的过程称之为类的实例化,对象称之为类的一个实例。
# foo_obj = Foo(10, 20, 30)
# print(foo_obj)


# number = 10   # int(10) ----> __init__(number, 10)
# int(10)
# l1 ---> list对象
# l1 = list([1, 2, 3])
# dict()
# tuple((1, 2, 3))
# float
# str
# set
# bool
# enumerate
# bytes
# filter

测试:人狗大战

'''
需求: 有一个人对象,狗对象,人狗互咬。

- 对象人1:
  - 特征:
      - 生命
      - 名字: name = '高弟'
      - 攻击力: arg

  - 技能:
      - 咬:bite

- 对象人2:
  - 特征:
      - 生命
      - 名字: name = '胡博'
      - 攻击力: arg

  - 技能:
      - 咬:bite

- 对象人3:
  - 特征:
      - 生命
      - 名字: name = '张志刚'
      - 攻击力: arg

  - 技能:
      - 咬:bite


- 抽象出类:
  - 人类:
      - 相同特征
          - 生命

      - 相同技能
          - 咬


狗对象1:
  - 特征:
      - 生命: 250
      - 名字: name = 'HCY'
      - 品种: dog_type = '哈士奇'
      - 攻击力: arg

  - 技能:
      - 咬:bite


狗对象2:
  - 特征:
      - 生命: 400
      - 名字: name = 'jason'
      - 品种: dog_type = '哈巴犬'
      - 攻击力: arg

  - 技能:
      - 咬:bite

狗对象3:
  - 特征:
      - 生命: 200
      - 名字: name = 'sean'
      - 品种: dog_type = '沙皮'
      - 攻击力: arg

  - 技能:
      - 咬:bite

狗类:
    - 相同特征

    - 相同技能
        - 咬
'''


# 人类
class People:

   def __init__(self, name, life, arg):
       self.name = name
       self.life = life
       self.arg = arg

   # 人调用bite时,传入狗对象
   def bite(self, dog_obj):
       print(f'人:[{self.name}] 开始 咬 狗:[{dog_obj.name}]!')

       # 减掉狗对象中的生命值 值为人的攻击力
       dog_obj.life -= self.arg
       print(f'狗的生命值减掉: [{self.arg}], 还剩狗的血量: [{dog_obj.life}]')

       if dog_obj.life <= 0:
           print(f'狗[{dog_obj.name}]已经挂了')
           return True



# 狗类
class Dog:
   def __init__(self, name, life, dog_type, arg):
       self.name = name
       self.dog_type = dog_type
       self.life = life
       self.arg = arg

   # 狗对象调用bite时,传入人对象
   def bite(self, p_obj):
       print(f'狗:[{self.name}] 开始 咬人:[{p_obj.name}]!')

       # 减掉人对象中的生命值 值为狗的攻击力
       p_obj.life -= self.arg
       print(f'人的生命值减掉: [{self.arg}], 还剩人的血量: [{p_obj.life}]')

       if p_obj.life <= 0:
           print(f'人[{p_obj.name}]已经挂了')
           return True


p1 = People('高弟', 2000, 500)
d1 = Dog('HCY', 250, '哈士奇', 2500)

p2 = People('高弟2', 5000, 50)
import time

while True:
   # 开始人狗互咬
   # if p1.life or d1.life:
   res1 = d1.bite(p2)

   if res1:
       break

   time.sleep(1)

   res2 = p1.bite(d1)

   if res2:
       break

   time.sleep(1)




 

posted @ 2019-11-25 18:59  迎着阳光  阅读(247)  评论(0编辑  收藏  举报