面向对象介绍

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'>




原文地址:https://www.cnblogs.com/cnhyk/p/11929467.html