面向对象编程

一、面向对象编程

  面向对象是一门编程思想,核心是“对象”二字,对象指的是特征与技能的结合体,基于该编程思想写程序,就好比创造世界,一种“上帝式”的思维方式

优点:解决了程序的扩展性

缺点:编写程序的复杂度高,可控性差

面向对象编程可以使程序的维护和扩展变得更简单,并且可以大大提高程序开发效率 ,另外,基于面向对象的程序可以使它人更加容易理解你的代码逻辑,从而使团队开发变得更从容。

二、类与对象

1、什么是类

类指的是类型,类别,是具有相同的特征和技能的一类事物就是类,对象指的是特征与技能的结合体,在现实世界中,先有一个个的对象,总结出类。在程序中,必须先有类,再通过调用类,产生对象。对象是实际存在的,类是抽象产生的

2、如何定义类

比如: 选课系统:
            - 选课系统学生类:
                - 学生对象1:
                    特征:
                        - 姓名: 张三
                        - 性别: 男
                        - 年龄: 23
                        - 学校: oldboy

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

                - 学生对象2:
                    特征:
                        - 姓名: 李四
                        - 性别: 男
                        - 年龄: 27
                        - 学校: oldboy

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

先从现实世界中通过一个个对象总结出类,然后再定义类,后调用类产生对象。

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

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

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

                - learn
                    def learn():
                        pass

                - course
                    def course():
                        pass

3、类的使用

'''
class 类名:
    特征
    技能

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

'''
 1 def foo():  # 函数名指向的是函数的内存地址
 2     pass
 3 
 4 
 5 print(foo)  # <function foo at 0x000001CDFF119048>
 6 
 7 
 8 # 定义老男孩学生类
 9 class OldboyStudent:  # 类名指向的是类的内存地址
10     # 学生相同的特征
11     # 在类中的特征 也称之为 “属性” attribute
12     school = 'oldboy'
13 
14     # 学生相同的技能
15     # 注意: 在类内部定义函数,会默认有一个参数self
16     def learn(self):  # self此时当做一个形参
17         print('learning....')
18 
19 
20 print(OldboyStudent)  # <class '__main__.OldboyStudent'>
21 
22 # 查看类的名称空间
23 print(OldboyStudent.__dict__)
24 print(OldboyStudent.__dict__['school'])
25 print(OldboyStudent.__dict__['learn'])
26 OldboyStudent.__dict__['learn'](123)
27 
28 
29 # 类提供一种特殊获取名字的方式  “类名.名字” 的方式
30 #
31 print(OldboyStudent.school)
32 OldboyStudent.learn('tank')
33 
34 #
35 OldboyStudent.school = 'OldGirl'
36 print(OldboyStudent.school)
37 
38 #
39 del OldboyStudent.school
40 
41 #
42 OldboyStudent.school = 'Oldboy'
43 print(OldboyStudent.school)
44 OldboyStudent.old_student = 'HuChenYang'
45 print(OldboyStudent.old_student)
'''
- 函数的名称空间:
    在调用函数时产生,函数调用结束后销毁。
    
- 类的名称空间:
    在定义阶段时产生,会将类中所有的名字,扔进类的名称空间中。
'''

4、对象

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

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

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

    调用类产生对象的过程称之为类的实例化,对象称之为类的一个实例。
'''
 1 class Student:
 2     # 学校
 3     school = 'oldboy'
 4 
 5     # 学习技能   ----> method ---》 方法
 6     def learn(self):
 7         print(self)  #
 8         print('learning...')
 9 
10 stu1 = Student()
11 stu2 = Student()
12 stu3 = Student()
13 print(Student)  #
14 print(Student.school, 'Student...')
15 print(Student.learn, 'Student...')
16 Student.learn(123)
17 print('=' * 100)
18 
19 print(stu1)  # <__main__.Student object at 0x0000017BFF8A5898>
20 print(stu1.school, 'stu1...')
21 print(stu1.learn, 'stu1...')
22 print(stu1)
23 # 对象调用方法时: 会将对象当做第一个参数传入方法中。
24 stu1.learn()  #
25 
26 print('=' * 100)
27 print(stu2)  # <__main__.Student object at 0x0000017BFF8A5898>
28 print(stu2.school, 'stu2...')
29 print(stu2.learn, 'stu2...')
30 stu2.learn()
31 
32 print('=' * 100)
33 print(stu3)  # <__main__.Student object at 0x0000017BFF8A5898>
34 print(stu3.school, 'stu3...')
35 print(stu3.learn, 'stu3...')
36 stu3.learn()
'''
由对象来调用类内部的函数,称之为对象的绑定方法。
    对象的绑定方法特殊之处: 会将对象当做第一个参数传给该方法。
'''
 1 class Student():
 2     # 学校
 3     school = 'oldboy'
 4 
 5     # 给对象添加新的属性
 6     def __init__(self, name, age, sex):
 7         print(self.__dict__)
 8 
 9         self.name = name
10         self.age = age
11         self.sex = sex
12 
13         # 查看当前类的名称空间
14         print(self.__dict__)
15 
16     # 公共方法
17     def learn(self):
18         print(self)
19         print('learning...')
20 
21 
22 # 查看类的名称空间
23 print(Student.__dict__)
24 
25 # stu1 = Student()  # Student(stu1)  ---> __init__(self)  ----> self == stu1
26 # stu2 = Student()  # Student(stu2)  ---> __init__(self)  ----> self == stu2
27 # stu3 = Student()  # Student(stu3)  ---> __init__(self)  ----> self == stu3
28 #
29 # stu1.name = '张三'
30 # stu1.age = 25
31 # stu1.sex = '男'
32 # print(stu1.name, stu1.age, stu1.sex)
33 
34 stu1 = Student('李四', 27, '')
35 print(stu1)
36 print(stu1.name, stu1.age, stu1.sex)

想要在调用类时,为对象传入对象独有的特征,需要用到绑定方法__init__

# __init__(self, name, sex, age):  # name---> 张三 ,  sex---> 女,  age----> 27
# 调用类时: 会将对象当做第一个参数,与括号内所有的参数一并传给__init__()
# stu1 = Student('李四', 27, '女')

在python中,一切皆对象,包括我们之前所学的数据类型例如

num = 10 ----> num = int(10),int就是一个类

list1 = [1, 2, 3] ----> list1 = list([1, 2, 3]),list也是一个类

对象名字的查找顺序:

  - 对象.属性,会先找对象自己的

  - 若对象没有,会去找类的

  - 若类没有,就会报错

调用类产生对象发生的事情:
1.会产生一个空对象的名称空间
2.会自动触发__init__,并且会将对象当做第一个参数传入。
3.会将调用类括号内的参数一并传给__init__()

对象绑定方法的特殊之处:
1.会将对象当做第一个参数传入。
2.若对象的绑定方法中还有其他参数,会一并传入。

 

 

 

posted @ 2019-11-25 16:49  treeter  阅读(155)  评论(0编辑  收藏  举报