面向对象编程
面向对象
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'>