Fork me on GitHub

day 19

1. 面向对象思想

什么是面向对象?

面向对象是一种编程思想。

  • 面向过程编程

    核心是“过程”二字,过程指的是做事情的步骤,即先做什么,然后做什么,最后做什么。

    基于该编程思想编写程序,就类似于一条工厂流水线,一种机械式的思维方式。

    • 优点

      逻辑清晰,将复杂的问题流程化,进而简单化。

    • 缺点

      可扩展性差。

  • 面向对象编程

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

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

    • 优点

      可扩展性高。

    • 缺点

      编写程序的复杂程度要远高于面向过程编程思想。

优先使用面向过程还是面向对象?

实际编程中需要面向过程结合面向对象一起使用

2. 类和对象

2.1 类和对象的定义

  1. 什么是对象

    特征和技能的结合体。

  2. 什么是类

    一系列对象相同的特征与技能的结合体。

2.2 类和对象的产生

  1. 在现实世界中

    对象是一个个具体存在的事物,类是由人类文明的发展抽象总结出来的。

  2. 在程序中

    必须遵循,先有类,再由对象。

2.3 在现实世界中定义类和对象

现实世界中,现有对象,后有类。

现实中的猫对象:

  • 猫对象1
    • 特征
      • 属性:萌
      • 品种:橘猫
      • 年龄:2
      • 体重:10
    • 技能
      • 抓老鼠
      • 爬树
  • 猫对象2
    • 特征
      • 属性:萌
      • 品种:狸花
      • 年龄:5
      • 体重:7
    • 技能
      • 抓老鼠
      • 爬树

根据对象抽象出类:

  • 猫类
    • 相同的特征
      • 属性:萌
    • 相同的技能
      • 抓老鼠
      • 爬树

2.4 在程序中定义类

程序中先定义类,再产生对象。

2.4.1 语法

class 类名:
	对象相同的特征
	对象相同的技能

#    class: 用来定义类的,class后跟的是类名。
#    类名: 类的名字,用来调用创造对象的。

# 注意: 类名必须要遵循驼峰命名法,python在定义变量与函数时不推荐使用,但在定义类时推荐使用。

定义类时发生的事情:

  • 类在定义时,会产生一个类的名称空间

  • 类内部的所有名字,都会存进名称空间

    注意:类在定义阶段已经产生好了名称空间,执行python文件时会执行类内部的代码

  • 定义一个类:

class Cat:
    att = 'cute'

    def catch(self):
        print('catch mouse.')

    def climb(self):
        print('climb up a tree.')

2.4.2 类的操作

  • 查看类的名称空间内所有名字

    print(Cat.__dict__)
    

    运行结果:

    {'__module__': '__main__', 'att': 'cute', 'catch': <function Cat.catch at 0x0000027ED1EB28C8>, 'climb': <function Cat.climb at 0x0000027EE0F3FB70>, '__dict__': <attribute '__dict__' of 'Cat' objects>, '__weakref__': <attribute '__weakref__' of 'Cat' objects>, '__doc__': None}
    
    Process finished with exit code 0
    
  • print(Cat.att)
    

    运行结果:

    cute
    
  • Cat.att='lovely'
    print(Cat.att)
    

    运行结果:

    lovely
    
    Process finished with exit code 0
    
  • Cat.master='tom'
    print(Cat.master)
    

    运行结果:

    tom
    
    Process finished with exit code 0
    
  • Cat.master='tom'
    print(Cat.master)
    
    del Cat.master
    print(Cat.master)
    

    运行结果:

    tom
    Traceback (most recent call last):
      File "D:/data/python/Learn/courses/day19/01 课程内容/代码/1 类.py", line 53, in <module>
        print(Cat.master)
    AttributeError: type object 'Cat' has no attribute 'master'
    
    Process finished with exit code 1
    

2.5 在程序中定义对象

2.5.1 语法

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

定义对象发生的事情:

  • 产生一个空的对象的名称空间

  • 会自动触发 __init__

  • 把对象本身以及括号内的参数一并传给 __init__ 函数

    总结:调用类会产生一个对象,调用类的过程叫做类的实例化,产生的对象称之为类的一个实例。

实例化一个对象:

# 定义一个类
class Cat:
    att = 'cute'

    def catch(self):
        print('catch mouse.')

    def climb(self):
        print('climb up a tree.')
        
# 实例化对象
cat1 = Cat()
cat2 = Cat()

# 查看对象属性
print(cat1.att)
cat1.catch()
cat1.climb()
print(cat2.att)
cat2.catch()
cat2.climb()

运行结果:

cute
catch mouse.
climb up a tree.
cute
catch mouse.
climb up a tree.

Process finished with exit code 0

2.5.2 定制对象独有的特征

方法:类定义阶段定制属性,使用 __init__ 函数。

# 定义类
class Cat:
    def __init__(self, att, variety, age, weight):
        self.att = att
        self.varieties = variety
        self.age = age
        self.weight = weight

    def catch(self):
        print('catch mouse.')

    def climb(self):
        print('climb up a tree.')

# 实例化对象时传特征
cat1 = Cat('cute', 'Orange Cat', 3, 10)
cat2 = Cat('lovey', 'Dragen-Li', 2, 6)

print(cat1.att, cat1.varieties, cat1.age, cat1.weight)
print(cat2.att, cat2.varieties, cat2.age, cat2.weight)

运行结果:

cute Orange Cat 3 10
lovey Dragen-Li 2 6

Process finished with exit code 0

3. 对象与类的查找顺序

对象与类的查找顺序:

  1. 对象的属性,若对象本身有,则查找对象自己具有的属性。
  2. 若对象本身不具备该属性,则去类里面找,若类也没有,则报错。

4. 对象的绑定方法

4.1 对象的绑定方法

class Cat:
    def __init__(self, name, att, variety, age, weight):
        self.name = name
        self.att = att
        self.varieties = variety
        self.age = age
        self.weight = weight

    def catch(self):
        print(f'{self.name}catch mouse.')

    def climb(self):
        print('climb up a tree.')
        
        
  • 类名称空间中定义的数据属性和函数属性都是共享给所有对象用的
  • 对象名称空间中定义的只有数据属性,而且是对象所独有的数据属性

4.2 类使用对象的绑定对象

cat1 = Cat('lucky', 'cute', 'Orange Cat', 3, 10)
cat2 = Cat('ball', 'lovey', 'Dragen-Li', 2, 6)

print(cat1.name)
print(cat2.name)

运行结果:

lucky
ball

Process finished with exit code 0
  • 类中定义的函数是类的函数属性,类可以使用,但使用的就是一个普通的函数而已,意味着需要完全遵循函数的参数规则,该传几个值就传几个

4.3 对象使用对象的绑定方法

print(id(cat1.climb))
print(id(cat2.climb))
print(id(Cat.catch))

cat1.catch()
cat2.catch()

运行结果:

1503122635976
1503122635976
1501259299696

lucky catch mouse.
ball catch mouse.

Process finished with exit code 0

  • 类中定义的函数是共享给所有对象的,对象也可以使用,而且是绑定给对象用的,
  • 绑定的效果:绑定给谁,就应该由谁来调用,谁来调用就会将谁当作第一个参数自动传入
posted @ 2019-10-09 20:36  Yugaliii  阅读(188)  评论(0编辑  收藏  举报