1.面向对象
??面向对象编程是在面向过程编程的基础上发展来的,它比面向过程编程具有更强的灵活性和扩展性,所以可以先了解下什么是面向过程编程:
??面向过程编程的核心是过程,就是分析出实现需求所需要的步骤,通过函数一步一步实现这些步骤,接着依次调用即可,再简单理解就是程序
??从上到下一步步执行,从头到尾的解决问题;
??而面向对象编程是把构成事物的整个需求按照特点、功能划分,将这些存在共性的部分封装成对象,创建对象的目的不是为了完成某一个步骤,
??而是为了描述某个事物在整个解决问题的步骤中的行为。 ????
??eg: 小明用美的洗衣机洗脏衣服,流程是怎样的?
??面向过程的解决方法:
????1、执行加洗衣液方法;
????2、执行开启洗衣机方法;
????3、执行加水方法;
????4、执行洗衣服方法;
????5、执行甩干方法;
????6、取出衣服;
????以上就是将解决这个问题的过程拆成一个个方法,通过按顺序执行方法来解决问题。
??面向对象的解决方法:
????1、可以先归纳出两个对象:“美的洗衣机”对象和“小明”对象
????2、针对对象“美的洗衣机”加入一些它的方法:“自动注水方法”“洗衣方法”、“烘干方法”
????3、针对对象“小明”加入他的方法:“加洗衣液方法”、“开启洗衣机方法”、“取出衣服方法”
????4、然后执行,使用对象.动作 的方式,执行各步骤
????小明.加洗衣液
????小明.开启洗衣机
????美的洗衣机.自动注水
????美的洗衣机.洗衣服
????美的洗衣机.烘干
????小明.取出衣服
????解决同一个问题 ,面向对象编程就是先抽象出对象,然后用对象执行方法的方式解决问题。
2.类
??如果想通过面向对象编程,首先需要创建一个类(class),才能实例化(或叫具象化)对象;
??(洗衣例子中要先有人这个类,才能有“小明”对象、先有洗衣机类,才能有“美的洗衣机”这个对象)
??类可以理解成一个模板,通过它可以创建出无数个具体实例(对象);
??使用类的关键字class,来声明类,首字母大写,多个单词时每个单词首字母要大写(驼峰命名法);
??eg: class MyName(object):
??????(object)可以不写,object是python中的一个通用对象,添加它后可以使用更多的内置功能;
class Test(object):
name = 'test' # 定义一个类属性
def run(self):
print(f'{self.name}在跑步!')
xiaoming = Test() # 实例化一个对象xiaoming
print(xiaoming.name) # 对象xiaoming可以调用类属性
xiaoming.run() # 对象xiaoming可以调用类方法
'''
test
test在跑步!
'''
??类的参数self
??可以看到类的方法中默认第一个参数是self,且是必填的;(python中的self关键字只用于类的方法中);
??self也是一个对象,它代表实例化变量(例子中的xiaoming)本身(xiaoming可以调用name属性和run方法,都是self帮助找到的)
class Person(object):
name = None # 类属性(也叫类实例化属性)
age = None
def run(self):
print('可以直接使用self调用类属性')
print('打印属性:'+str(self.name))
a = 'new' # 类方法中定义的变量无self时,属于方法中的局部变量
print('打印局部变量:'+a)
def work(self):
print('利用self可直接调用类中其它类函数')
self.run()
def jump():
print('不添加self参数,就不属于类函数,就不可以被实例化的对象调用')
# 实例化一个对象xiaoming
xiaoming = Person()
# 可以直接调用类属性(类实例化属性)
print(xiaoming.name) # None
# 也可为类属性(类实例化属性)重新赋值
xiaoming.name = 'xiaoming'
# 调用类方法, 调用时无需传递self参数值
xiaoming.work()
'''
利用self调用类中其它函数
可以直接使用self调用类属性
打印属性:xiaoming (此时类属性值已被实例化对象修改)
打印局部变量:new
'''
# print(xiaoming.a) # AttributeError: 'Person' object has no attribute 'a' 方法中的局部变量不可被实例化对象调用
# 实例化另一个对象xiaohong
xiaohong = Person()
print(xiaohong.name) # None # 对象xiaohong并不会使用到对象xiaoming修改的类属性(类实例化属性)值;对象修改的类属性(类实例化属性),只能作用于对象本身
xiaohong.jump() # 非类函数无法被对象调用,直接报错
'''
Traceback (most recent call last):
File "D:\python_exercise\test_calss.py", line 44, in <module>
xiaohong.jump()
TypeError: Person.jump() takes 0 positional arguments but 1 was given
'''
# 可以看到报错信息是函数无参数值,却被传递了一个,说明对象在调用方法时,自动传递了self参数,所以直接报错了
3.类的构造函数
??类中的一种默认函数,用来将类实例化的同时,将参数传入类中;(类似于函数执行时,可以传一些参数)
??def __init__(self, a, b):
????self.a = a # 类实例化对象的属性
????self.b = b
??此时self.a和self.b就可以在类的各个类函数中使用了;
class Person(object):
def __init__(self, name):
self.name = name # self.声明的变量是类实例属性
def run(self):
print(f"{self.name}在跑")
test = Person('x')
test.run() # x在跑
'''
此时已经见过了类中可定义的多种变量
类下直接定义的变量,属于类属性、又属于类实例化对象属性 (可被实例化后的对象直接引用)
构造函数中self.开头定义的属性,属于类实例化对象属性,不属于类属性(可被实例化后的对象直接引用)(工作中多用,且多在构造函数中提前定义好)
类函数中a=''定义的变量,属于局部变量,既不属于类实例化对象属性,也不属于类属性(不可被实例化后的对象直接引用)
'''
4.对象的生命周期
??一个对象从出生到消亡的过程;
??实例化对象后,会调用内置函数__init__, 此时对象生命开始,该对