面向过程和面向对象
一、面向过程
什么是面向过程:
面向过程的核心就是过程,即解决问题的流程,例如将要将一直大象放入冰箱,首先得先打开冰箱门,然后将大象放入冰箱门,再关上冰箱门。
一步一步的完成,类似于工厂的流水线一般。
面向过程的优缺点
优点:将复杂的问题流程化,继而简单化
缺点:拓展性差,可维护性弱,修改其中的一部分可能就要在全部地方修改,牵一发而动全身
应用场景:安装包的使用
二、面向对象
什么是对象:
在程序中,对象就是存放数据和函数的容器
面向对象的的优缺点
优点:拓展性强,可维护性强
缺点:编程复杂度高
应用场景:微信、qq

三、类的定义和对象的产生
什么是类?
在程序中,我们将一系列对象有相同的功能和数据,那么该多个对象就属于同一个类
类与对象的关系
在程序中,必须先定义类,调用类才会产生对象
定义类时发生的事情
在定义类时,会立即执行类体代码,然后产生一个该类的名称空间,把类体里的名字都放入到该名称空间中,将__dict__绑定给给类名称空间,该名称空间可以看成是一个字典。
我们一般使用 class 来定义一个类,类的名字首字母都会采用大写
class Student():
pass
调用类时发生的事情
在调用类产生一个对象时,会产生一个对象的名称空间,将__dict__绑定给对象名称空间,该名称空间也可以看作是一个字典
这个过程一般称之为对象实例化,一般会用到一个变量名,这个变量名就是一个实例,然后将对象赋值给变量名

四、给对象定制特有的属性
class People():
# 对象中如有有需要传值的,可以使用魔术手法__init__, 在调用类时会直接执行该函数体代码,给对象增加需要的属性
# 如果没有增加的属性,这一句可以不写
def __init__(self, name, age, gender):
self.name = name
self.age = age
self.gender = gender
def goHome(self):
print('%s,%d岁,%s辍学回家' % (self.name, self.age, self.gender))
def kanChai(self):
print('%s,%d岁,%s砍柴' % (self.name, self.age, self.gender))
def quXiFu(self):
print('%s,%d岁,%s开车娶媳妇' % (self.name, self.age, self.gender))
# 实例化对象
people1 = People('老李', 18, '男')
people2 = People('校思豪', 12, '女')
people3 = People('唐浩', 22, '男')
# 使用类中的方法
people1.quXiFu() # 老李,18岁,男开车娶媳妇
people2.goHome() # 校思豪,12岁,女辍学回家
people3.kanChai() # 唐浩,22岁,男砍柴
五、属性的查找顺序
属性的查找
对象的本质就是一个名称空间而已,对象名称空间是用来存放自己独有的名字或属性。
类中存放的是所有对象共有的属性。
所以会先从自己的对象中查找属性,如果没有的话就会去到产生对象的类中查找
类属性与对象属性
类属性:在类中写的属性就叫做类属性
对象属性:在对象名称空间生成的就叫做对象属性
类属性的查找
1. 查
类名 属性名
print(Student.school)
2. 添加类属性
类名 属性名 属性值
Student.country = 'China'
3.修改类属性
类名 属性名 属性值
Student.school = 'BJ'
4.删除类属性
类名 属性名
del Student.school
5.调用方法
Student.方法名()# 需要几个参数传几个参数
对象属性的查找
1. 查
对象名 属性名
print(stu.name)
2. 添加类属性
对象名 属性名 属性值
stu.name = 'mike'
3.修改类属性
对象名 属性名 属性值
stu.name = 'jerry'
4.删除类属性
对象名 属性名
del stu.school
5.调用方法
stu.方法名()# 需要几个参数传几个参数
ps:类中的方法 类可以调用,属性也可以调用,推荐对象来调用,因为对象来调用,会把自己当成第一个参数传递给函数

六、类与对象的绑定方法与静态方法(非绑定方法)
对象的绑定方法:
在类中没有被任何装饰器修饰的方法就是 绑定到对象的方法,这类方法专门为对象定制。
class Person:
country = "China"
def __init__(self, name, age):
self.name = name
self.age = age
def speak(self):
print(self.name + ', ' + str(self.age))
p = Person('laowang', 18)
print(p.__dict__) # {'name': 'laowang', 'age': 18}
p.speak() # 使用对象调用类中的方法 不需要再传值,会自动将对象当成第一个参数传给方法
Person.speak(p) # 使用类调用则需要添加第一个对象的参数
类的绑定方法:
类中使用 @classmethod 修饰的方法就是绑定到类的方法。这类方法专门为类定制。通过类名调用绑定到类的方法时,会将类本身当做参数传给类方法的第一个参数
class Person:
country = "China"
def __init__(self, name, age):
self.name = name
self.age = age
@classmethod
def speak(cls):
print(cls.country)
p = Person('laowang', 18)
print(p.__dict__)
p.speak() # China 对象也可以调用该方法,但不推荐使用
Person.speak() # China 绑定类后就可以自动将类名当作第一个参数传进去了 在用类使用该方法时就不需要传值了
静态绑定(非绑定方法)
有时候在方法里面用不到类或者对象里的属性,就不需要传参了,就可以使用@classmethod 修饰的方法,将该方法既不绑定给类名,也不绑定给对象名
class Person:
country = "China"
def __init__(self, name, age):
self.name = name
self.age = age
@staticmethod
def create_id():
import uuid
return uuid.uuid4()
p = Person('laowang', 18)
print(p.create_id()) # cbe23629-43a6-4910-ae5c-3f264244e234
print(Person.create_id()) # 64875abe-6401-4771-a4ed-90b982886ffe
总结:
绑定方法:
-
@clssmethod是一个装饰器,放在类中函数的上面,该函数就变成了类的绑定方法
-
类的绑定方法有类来调用,自动把类传过去,对象也可以调用,一般不用
-
类的绑定方法用在什么地方?, 不需要通过对象,只需要通过类就能完成某些事的时候,就把该方法定义为类的绑定方法
-
非绑定方法:
- @staticmethod是一个装饰器,放在类中函数的上面,该函数就变成了类的绑定方法
- 非绑定方法就是将普通方法放到了类的内部。


浙公网安备 33010602011771号