面向对象介绍

跟風遠走 提交于 2019-11-25 19:08:45

TOC

面向对象

一、什么是面向对象

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

面向对象是一门编程思想

1.1 面向过程编程思想

核心是过程二字,过程指的是解决问题的步骤,即先干什么再干什么

基于该编程思想编写程序,就好比在设计一条工厂流水线,一种机械式的思维方式。

  • 优点
    • 将复杂的问题流程化,进而简单化
  • 缺点
    • 牵一发而动全身,程序的可扩展性差

1.2 面向对象编程思想

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

基于该编程思想编写程序,就好比在创造世界,一种上帝式的思维方式。

  • 优点
    • 可扩展性高
  • 缺点
    • 编写程序的复杂程度比面向过程高

二、如何产生对象

产生对象前需要先了解什么是类

2.1 什么是类

类指的是类型、类别,是面向对象分析和设计的基石

  • 在两种角度去看待
    • 现实世界中
    • 先有一个个对象,经过社会的文明发展,产生抽象的类
    • 在程序中
    • 必须先有类,再通过调用类,产生对象


对象是用来存放数据与功能的容器

那么类则是用来存放多个对象相同的数据与功能的容器


2.2 如何定义类

面向对象的基本思路就是把程序中要用的、相关联度的数据与功能整合到对象里,然后再去使用,例如:学生,老师,课程等,显而易见的是:学生有学生相关的数据与功能,老师有老师相关的数据与功能,以学生为例:

# 学生的数据有  学校  名字  年龄  性别    # 学生的功能  选课

详细的

# 学生1  数据:      学校=清华大学      姓名=张三      性别=男      年龄=28  功能:      选课    # 学生2  数据:      学校=清华大学      姓名=韩梅梅      性别=女      年龄=18  功能:      选课    # 学生3  数据:      学校=清华大学      姓名=李四      性别=男      年龄=25  功能:      选课

我们可以总结出一个学生类,用来存放学生们相同的数据与功能

# 学生类  相同特征:      学校=清华大学  相同功能:      选课

基于上述分析的结果,我们接下来需要做的就是在程序中定义出类,然后调用类产生对象

class Student:  # 类的命名应该使用“驼峰体”        school='清华大学'  # 数据        def choose(self):  # 功能          # 注意:在类内部定义函数,会默认有一个参数self          print('%s is choosing a course' %self.name)

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

class Student: # 类名指向的是类的内存空间

2.2.1 函数的名称空间和类的名称空间的区别

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

三、什么是对象

  • 调用类拿到的返回值就是程序中的对象,或者称之为类的实例化
  • 对象是用来存放数据与功能的容器
  • 不同的对象虽然调用的是同一个类,但是每个对象中的内存地址是不一样的的,但类的数据是一样的
# 定义类  calss People:      country = 'China'      def __init__(self, name, age, sex):          self.name = name          self.age = age          self.sex = sex      def learn(self):          print('learnin....')      # 调用类  People()  # 调用类的方法:类名+()  # 调用类返回的值就是对象  p_obj = People()  # 此时p_obj就是对象

2.3 类的操作

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

调用类产生对象发生的事情:

    1、会产生一个空对象的名称空间        2、会自动触发`__init__`,并且会将对象当做第一个参数传入        3、会将调用类括号内的参数一并传给`__init__()`  
calss People:      country = 'China'      def __init__(self, name, age, sex):          self.name = name          self.age = age          self.sex = sex      def learn(self):          print('learnin....')

四、类和对象的操作:增、删、查、改

4.1 查看类和对象的名称空间

类.__dict__ 对象.__dict__

class People:      country = 'China'        def __init__(self, name, age, sex):          self.name = name          self.age = age          self.sex = sex        def learn(self):          print('learning.....')

查看类的名称空间

print(People.__dict__)      {'__module__': '__main__', 'country': 'China', '__init__': <function People.__init__ at 0x00000257B37E3D38>, 'learn': <function People.learn at 0x00000257B37E3318>, '__dict__': <attribute '__dict__' of 'People' objects>, '__weakref__': <attribute '__weakref__' of 'People' objects>, '__doc__': None}  # 可以看到返回类的名称空间中包含我们定义的country,init,learn等

查看对象的名称空间

p1 = People('tank', 16, 'male')  print(p1.__dict__)    {'name': 'tank', 'age': 16, 'sex': 'male'}

4.2 类和对象的属性(类中的变量)操作

4.2.1 查找类和对象的属性

# 查找类的属性  print(People.country)    China    # 查找对象的属性  p1 = People('tank', 16, 'male')  print(p1.name)    tank

4.2.2 增加类和对象中的属性

# 增加类的属性  People.number = 100000  print(People.number)    100000    # 增加对象中的属性  p1 = People('tank', 16, 'male')  p1.sal = 8000  print(p1.sal)    8000

4.2.3 修改类和对象中的属性

# 修改类的属性  People.country = '中国'  print(People.country)      中国      # 修改对象的属性  p1 = People('tank', 16, 'male')  p1.name = 'sean'  print(p1.name, p1.age, p1.sex)      sean 16 male

4.2.4 删除类和对象中的属性

# 删除类的属性  del People.country  print(People.country)    AttributeError: type object 'People' has no attribute 'country'    # 删除对象的属性  p1 = People('tank', 16, 'male')  del p1.name  print(p1.name, p1.age, p1.sex)    AttributeError: 'People' object has no attribute 'name'

五、类中的数据属性(类中的变量)

类中的属性是给对象使用的

p_obj1 = People('tank', 17, 'male')  p_obj2 = People('jason', 71, 'female')  p_obj3 = People('大饼', 72, 'female')    print(p_obj1)  print(p_obj2)  print(p_obj3)    <__main__.People object at 0x0000025FBA358C48>  <__main__.People object at 0x0000025FBA358C88>  <__main__.People object at 0x0000025FBA358CC8>    # 注意:不同的对象,内存地址是不一样的

对象引用类中的属性,指向的都是类中同一个内存地址

print(p_obj1.country, id(p_obj1.country))  print(p_obj2.country, id(p_obj2.country))  print(p_obj3.country, id(p_obj3.country))      China 1551817278384  China 1551817278384  China 1551817278384

六、类中的方法(类中的函数)

类中方法是给对象使用的

由不同的对象来调用就会将方法绑定给不同的对象,并且会将对象当做第一个参数传入。

print(People)  print(p_obj1.learn, id(p_obj1.learn))  print(p_obj2.learn, id(p_obj2.learn))  print(p_obj3.learn, id(p_obj3.learn))      <class '__main__.People'>  <bound method People.learn of <__main__.People object at 0x0000020FC47F8C88>> 2266592990536  <bound method People.learn of <__main__.People object at 0x0000020FC47F8CC8>> 2266592990536  <bound method People.learn of <__main__.People object at 0x0000020FC47F8D08>> 2266592990536

每个不同对象调用类中方法的时候,每个对象指向的内存ID不一样,pycharm中有优化机制,所以相同

七、对象属性的查找顺序

先从对象自己名称空间中查找 ---> 类的名称空间

八、对象绑定方法的特殊之处

  • 会将对象当做第一个参数传入
  • 若对象的绑定方法中还有其他参数,会一并传入
calss People:      country = 'China'      def __init__(self, name, age, sex):          self.name = name          self.age = age          self.sex = sex      def learn(self):  # 在类中就是方法(类中的函数)          print('learnin....')      p_obj1 = People()  p_obj.learn()   # 对象绑方法就是对象调用类中的函数

九、一切皆对象

在python3中,类即类型。

print(type(str1))    <class 'str'>      l1 = [1, 2, 3]  print(l1)    <class 'list'>




易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!