1、面向过程的编程思想
1.1、编程思想的定义
编程思想就是编写程序的套路,与具体的技术点无关
1.2、面向过程的定义及优缺点
核心是过程二字,过程就是解决问题的步骤,也就是先干什么、再干什么、后干什么
过程的终极奥义就是将程序流程化
过程是"流水线",用来分步骤解决问题的
基于该思想编写程序就好比在涉及一条条的流水线
优点:复杂的问题流程化、进而变得简单化
缺点:所有环节耦合到一起,环环相扣,如果要修改某个环节,有可能会牵一发而动全身,扩展性差
2、什么是面向对象编程
2.1、面向对象编程的定义及优缺点
核心是对象二字,对象就是一个用来盛放相关数据与相关功能的容器
对象的终极奥义就是将程序"整合"
对象是"容器",用来盛放数据与功能的
类也是"容器",该容器用来存放同类对象共有的数据与功能
程序=数据+功能
优点:程序解耦合强,扩展性高
缺点:比面向过程更复杂
2.2、定义类
类是对象相似数据与功能的集合体,定义类申请内存空间,把对象之间相同的数据与功能存起来
所以类体中最常见的是变量与函数的定义,但是类体其实是可以包含任意其他代码的
注意:类体代码是在类定义阶段就会立即执行,会产生类的名称空间
class Dog:
name = '小白'
def say(self):
print('我的名字是<%s>' % (self.name))
print('我会执行')
print(Dog.__dict__)
属性访问的语法
类属性操作:类与对象都可以通过.来访问属性完成增删改查的操作
1、访问数据属性
print(Dog.name)
访问类的函数属性:它就是一个普通函数,该传几个参数就传几个参数,没有自动传参的说法
2、访问函数属性
print(Dog.say)
Dog.x = 1111
print(Dog.__dict__)
2.3、调用类产生对象
调用类来产生对象,调用类的过程又称之为实例化
调用类的本质:就是产生一个与类相关联子空间
dog1_obj = Dog()
dog2_obj = Dog()
dog3_obj = Dog()
print(dog1_obj.__dict__)
print(dog2_obj.__dict__)
print(dog3_obj.__dict__)
为对象定制自己独有的属性
dog1_obj.color = 'black'
print(dog1_obj.__dict__)
对象属性操作:对象.属性,会先从对象自己的空间里找,没有话去类中找
类中的定义的数据属性为了给对象用的,而且所有对象共享的,大家访问的都是同一个地址
print(id(Dog.name))
print(id(dog1_obj.name))
print(id(dog2_obj.name))
print(id(dog3_obj.name))
修改类的数据属性,所有对象都会跟着改
Dog.name = '小黑'
print(dog1_obj.name)
print(dog2_obj.name)
print(dog3_obj.name)
修改对象的数据属性,只会当前对象的属性跟着改
dog1_obj.name = '小黑'
print(Dog.name)
print(dog1_obj.name)
print(dog2_obj.name)
print(dog3_obj.name)
类中的定义的函数属性,类可以调用但就是一个普通函数,而类中函数通常都是为对象准备的,也就是说是给对象用的,如何给对象用?
需要绑定给对象
dog1_obj.say()
Dog.say(dog1_obj)
dog2_obj.say()
Dog.say(dog2_obj)
dog3_obj.say()
Dog.say(dog3_obj)
2.4、__init__的使用
class Person:
def __init__(self,name,age,gender):
self.name = name
self.age = age
self.gender = gender
def running(self):
print('%s正在跑步' % self.name)
obj1 = Person('allen',18,'male')
obj2 = Person('lily',20,'female')
print(obj1.running)
print(obj2.running)
调用类的过程又称之为实例化,发生了三件事
1、先产生一个空对象
2、python会自动调用类中的__init__方法然将空对象已经调用类时括号内传入的参数一同传给__init__方法
3、返回初始完的对象
2.5、__init__的总结
1、会在调用类时自动触发执行,用来为对象初始化自己独有的数据
2、__init__内应该存放是为对象初始化属性的功能,但是是可以存放任意其他代码,想要在类调用时就立刻执行的代码都可以放到该方法内
3、__init__方法必须返回None