面向对象编程

面向对象

1、什么是面向对象

面向对象是一门编程思想

面向过程编程思想:

  • 核心是 “过程” 二字,过程指的是解决问题的步骤,即先干什么再干什么!基于该编程思想编写程序,就好比在设计一条工厂流水线,一种机械式的思维方式。
  • 优点: 将复杂的问题流程化,进而简单化
  • 缺点: 牵一发而动全身,程序的可扩展性差

面向对象编程思想:

  • 核心是“对象”二字,对象是 “特征与技能” 的结合体,基于该编程思想编写程序就好比上帝在创造万物,一种上帝式的思维方式。
  • 优点:可扩展性高
  • 缺点:编写程序时复杂程度比面向过程编程高

2、如何产生对象

1、什么是类

类指的是类型,一系列对象之间相同的特征与技能的结合体

在现实世界中,先有对象再定义出类,类是抽象产生的,对象是实际存在的

在程序中,必须先定义类,然后再调用类得到返回值得到对象

2、如何定义类

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

语法:class + 类的名字:(类名要是驼峰体)

​ 对象之间相同的特征(数据属性,变量)

​ 对象之间相同的技能(类中的方法,函数)

3、类的实例化

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

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

  • 产生一个空的对象的名称空间
  • 会自动触发类中的__ init__() , 并将对象当做第一个参数传入
  • 会将调用类括号内的参数,一并传入__ init__()中
# 定义一个People类名,注意使用驼峰体
class People:
    country = '中国'

    def __init__(self,name,age,sex):
        # 给对象添加新属性
        self.age = age
        self.name = name
        self.sex = sex

    #类里面定义函数默认会传入一个self当形参
    def learn(self):
        print('学习技能')

p1 = People('shen', 18, 'male')
print(p1.name) # shen
print(p1.age) # 18
print(p1.sex) # male
#直接通过类来调用类中的函数需要传入任意一个参数给self
People.learn(111)
#通过对象来调用类中的函数,不需要传入参数,因为对象会被当做参数传入
p1.learn()

4、查看类与对象的名称空间 类.__ dict __ 对象.__ dict__

通过类.__ dict __ 或 对象.__ dict__ 查看类与对象的名称空间,也可以通过.__ dict __['类或对象中的名字']直接查看值

# # 定义一个People类名,注意使用驼峰体
class People:
    country = '中国'

    def __init__(self,name,age,sex):
        self.age = age
        self.name = name
        self.sex = sex

    #类里面定义函数默认会传入一个self当形参
    def learn(self):
        print('学习技能')

p1 = People('shen', 18, 'male')
print(p1.__dict__) # {'age': 18, 'name': 'shen', 'sex': 'male'}
print(p1.__dict__['age']) # 18
print(People.__dict__) # {'__module__': '__main__', 'country': '中国', '__init__': <function People.__init__ at 0x000002CCD9AC2B88>, 'learn': <function People.learn at 0x000002CCD9AC6DC8>, '__dict__': <attribute '__dict__' of 'People' objects>, '__weakref__': <attribute '__weakref__' of 'People' objects>, '__doc__': None}
print(People.__dict__['country']) # 中国
print(People.__dict__['learn']) # <function People.learn at 0x0000015CFB1A6DC8>

5、类或对象的属性操作:增、删、改、查

class People:
    country = '中国'

    def __init__(self,name,age,sex):
        self.age = age
        self.name = name
        self.sex = sex

    #类里面定义函数默认会传入一个self当形参
    def learn(self):
        print('学习技能')

p1 = People('shen', 18, 'male')
# 查
print(p1.country) # 中国
# 改
p1.country = 'China'
print(p1.country) # China
# 删
del p1.sex
print(p1.sex) # 删除后报错
# 增
People.salary = 150000000000
print(People.salary) # 150000000000
print(p1.salary)# 150000000000

6、类中的数据属性(类中的变量):类中的数据属性是所有对象共享的,对象引用类中的属性,指向的都是类中同一个内存地址

7、类中的方法(函数):类中的方法(函数属性)是绑定给对象使用的,由不同的对象来调用,传入函数中的self不同,内存地址都不一样

p1 = People('shen', 18, 'male')
p2 = People('shen1', 19, 'male')
p3 = People('shen2', 20, 'male')
print(p1.country, id(p1.country)) # 中国 1853896576144
print(p2.country, id(p2.country)) # 中国 1853896576144
print(p3.country, id(p3.country)) # 中国 1853896576144

调用类中的方法,id相同,只是传入的对象给self不同所以方法不同
print(People.learn, id(People.learn)) # <function People.learn at 0x000002A39FF26DC8> 2901786389960
print(p1.learn, id(p1.learn)) #<bound method People.learn of <__main__.People object at 0x00000153E75690C8>> 1459724834120
print(p2.learn, id(p2.learn)) #<bound method People.learn of <__main__.People object at 0x00000153E73BF708>> 1459724834120
print(p3.learn, id(p3.learn)) #<bound method People.learn of <__main__.People object at 0x00000153E73BF588>> 1459724834120

8、对象的绑定方法

由对象来调用类里面的函数称为对象的绑定方法

对象的绑定方法的特殊之处:

  • 会将对象当做一个参数传入
  • 若对象的绑定方法还有其他参数,会一并传入

9、对象属性的查找顺序

对象.属性:先从对象自身的名称空间中查找——》类的名称空间中查找——》再找不到会报错

10、python中一切皆对象

用type方法打印出有 都是类,调用即产生对象,八大数据类型皆是类,定义时自动调用类产生对象,等等

str1 = '沈'
print(type(str1))  # <class 'str'>
list1 = [1, 2, 3]
print(type(list1))  # <class 'list'>
posted @ 2019-11-25 19:51  Mr沈  阅读(221)  评论(0编辑  收藏  举报