python中的面向对象思想、类及其属性和方法

# 类和对象

万物皆对象,无处不对象
变量是对象,函数是对象
~~~

### 面向对象的思想

思想(不存在的---抽象的---理解)
(非结构化编程---结构化编程)---面向过程的思想(以过程为核心---只考虑过程)

第一个面向对象的语言:smalltalk
面向对象的革命:Java
C:纯面向过程的语言---C++:拥有面向对象思想的面向过程的语言
python:纯面向对象的语言

OOP:面向对象编程

### 对象

对象 :来自生活(现实世界)----一切客观存在的事物(看得见,摸得到)
电脑,水,空气,人,地球

* 对象的构成

1. 属性:
        有什么
2. 方法:
        能干什么
        
对象=属性+方法

* 属性

1. 属性可以又是一个对象

* 方法

1. 可以被别的对象调用
2. 可以被自己调用

* 客观世界由对象组成

1. 大对象是由小对象组成
2. 对象和对象之间彼此方法相互调用

* 如何建立解题思路

例如:北京--->世界杯(俄罗斯)
面向过程:
    1. 出行方式
        火车---买票+护照+方向+维修+乘务员+吃喝+休息+充电+安全+高原反应+其他
        飞机---买票+护照+航向+维修+服务+机长+天气+降落+紧急情况+接机
        步行---吃喝拉撒+鞋+钱+安全+其他
        轿车---路线+加油站+护照+吃饭+住宿+维修+身体+其他
面向对象:
    1. 找对象:
        飞机
    2. 找方法:
        交通运输(机票,护照)
        
找对象+找方法

* 解决客观问题

1. 找对象
        把合适的对象准备好
2. 找方法
        对象之间合理配合

* 小结

1. 面向过程的编程思想:把每一步都细化到十分精致(精益求精),只考虑过程
2. 面向对象的编程思想:找到合适的对象,调用合适的方法

## 面向对象在计算机中的使用

计算机解决的需求---来源现实世界
把客观世界的需求,用计算机来实现
1. 面向对象的核心:
        计算机模拟现实世界,从而解决现实世界的问题

沟通:语言,文字(飞鸽传书,镖局)信号(狼烟)  
沟通需求:邮局:信件---BB机---电脑(电子邮箱)---软件(QQ,wechat,飞秋)
购买需求:原始时期:以物换物---贝壳(纸币,硬币---虚拟货币---价值符号)---商业---购买需求:
吃+喝+玩+学+看+听---硬需---服务(第三产业):外卖+餐饮+中介+旅游+娱乐+物业+电信---软件(美团+淘宝+滴滴+携程+短租)

* 计算机中的对象

~~~markdown
抽象:

计算机中的对象存储在内存中(属性+方法---数据)----模拟对应的对象

现实世界:
学生:
    属性:姓名(小明)+年龄(18)+性别(男)+学号(007)
    方法:学习+沟通+吃饭+睡觉
计算机世界:
学生:
    属性:name='小明'+age=18 + sex='male' + ID=007
    方法:def learn()+def community()+def eat()+def sleep()

* 小结

1. 面向对象思想的核心:
        模拟现实世界从而解决现实世界的问题
2. 使用面向对象的思想解题
        题目:来自于现实世界
        现实世界怎么做,计算机就怎么做
3. 面向对象的特性(纲领)
        1. 各司其职
        2. 弱耦合性
        3. 可重用性
        4. 可扩展性
        
OOP:Object Oriented Programming:面向对象的编程
OOD:Object Oriented Design:面向对象的设计
OOA:Object Oriented Analysis:面向对象分析
~~~

---

### 类

1. 类是抽象的,是对象共性的抽取
        类是对象的抽象,对象是类的具象
2. 是客观世界在人脑中的一种反应
3. 是对象的模板
        (汽车图纸(数据)---汽车)

狗类(抽象)---京巴---金毛---藏獒---毛+4条退+尾巴+汪汪叫+动+跑+吃+睡觉
猫类(抽象)---英短---加菲---折耳---毛+4条退+尾巴+喵喵叫+动+跑+吃+睡觉
鱼类(抽象)---带鱼---鲨鱼---鲤鱼---腮+尾巴+动+游+吃+睡觉

动物类(抽象)---动+吃+睡觉
~~~

* 如何编写一个类

~~~markdown
类是对象的模板
对象=属性+方法
类---属性+方法
~~~

~~~python
# 类---属性+方法-----类-创建对象
class Student:
    #属性
    name='小明'
    age=18
    sex='male'
    id='007'
    #方法
    def learn(self):
        print('l love learn')
    def eat(self):
        print('I can eat')
    def sleep(self):
        print('I want sleep')


s=Student()
print(s.name)
print(s.age)
print(s.sex)
s.eat()
 

1. 属性分类:(属性---变量)
        类属性:定义在类之内任何方法之外的变量
        实例属性:定义在方法之内的属性
2. 实例:通过类所创建出来的对象
3. 访问:使用  .  的形式进行调用
4. 类属性:
        1. 有且只有一份
        2. 用实例.属性名方式修改,创建了一个同名的实例属性(汽车的改装)
        3. 类属性可以通过类名直接调用
                类属性属于全类共有
        4. 类属性,对象创建出来后,可以直接使用
        5. 类属性和实例没有必然联系(类属性的创建和实例无关)
        6. 作用范围:全类
5. 实例属性:
        1. self.属性名创建
        2. 对象创建出来之后,还没有创建,只有调用了包含该实例属性的方法之后,才能使用
        3. 归实例所有
        4. 作用范围:全类
6. 小结
        实例属性:只有创建了实例之后才能使用
        类属性:只要有类就能调用

* 实例属性和类属性

1. 类属性:
        有且只有一份,牵一发而动全局,
2. 实例属性:
        实例属性每个实例各自拥有,相互独立,互不干涉

* 方法

类比于函数
1. 方法的声明:能做什么
2. 方法的实现:怎么做
3. self:
        1. self指代是当前对象(谁调用方法谁就是当前对象)
        2. self变量名可以修改(本质上只是一个位置参数)
        3. self被传递进来的是外面的对象的地址(引用)
4. 实例调用方法,系统会自动传递当前对象
5. 类名.调用方法,系统不会传递当前对象(手工传递)
~~~

---

### 构造方法

~~~markdown
1. __init__(self):
        初始化方法/构造方法
        在创建对象时自动调用,不需要手工调用
2. __init__(self,param1,param2...)
        构造方法可以有多个参数,使用逗号隔开
3. 如果一个类中没有任何构造,系统会自动调用父类的构造方法
4. 类中可以写多个构造方法,但是只会执行最后一个构造方法
        方法相同,覆盖掉前面的同名方法
5. 构造方法有返回值,返回值必须是None
~~~

* 创建对象

~~~markdown
1. 创建对象
        1. 变量名=类名(构造参数)
        2. 类名(构造参数) ----也创建了对象(没有引用)
                使用一次的时候使用
                没有引用的对象--垃圾---回收
2. 创建出的对象:
        称之为实例
        实例:instance
        和实例相关的属性:实例属性
        和实例相关的方法:实例方法

* 组合

~~~markdown
大对象是由小对象组成
大对象的属性也是一个对象

1. 如果一个类中的属性是一个对象,则称为组合
~~~

~~~python
class Student:
    age=6

class Teacher:
    salary=9999999

class School:
    s=Student()
    t=Teacher()
    def getClass(self):
        print('学生到校上课,老师到校讲课')


school=School()
school.getClass()
print(school.t.salary)
print(school.s.age)

* 补充

1. 如果实例属性和方法名发生命名冲突,则实力属性执行之后会覆盖掉同名的方法对象
2. 如果类属性和方法名发生命名冲突,则调用名字时会返回方法对象

* 公有私有

1. 在属性名前加两条下划线
        private:私有
2. 在属性名前加一条下划线
        protected:受保护的
        当前文件+其他文件中的子类
3. 私有属性访问范围:本类可以访问
4. 属性私有化+提供对应的get/set方法
        给私有化熟悉提供外部访问的接口
5. python为了实现私有化,namemangling的方式进行的私有化
        也称之为:名字重构
        _类名__类属性名(_类名私有属性名)
        python本质并没有将属性私有化,只是改了名字(伪私有化)

* 引用

引用:一个包含了地址的变量
a=10---a是10的引用

1. 如果一个对象没有引用,则会被视为垃圾回收掉
2. 引用的传递
        多个变量的首地址通过传递指向同一个对象
        牵一发而动全局
        a=10
        b=a   # a将引用传递给了b---a和b指代同一个对象(地址)
        
        self:引用传递
      

class Dog:
    age=4
    def hehe(self):
        print(self.age)  #

black=Dog()
black.age=100
black.hehe()

猜你喜欢

转载自blog.csdn.net/qq_42393859/article/details/82861079