1.面向对象(Objetct Oriented Programming):
(百度百科)面向对象程序设计方法是尽可能模拟人类的思维方式,以对象为核心,该方法认为程序由一系列对象组成。
(简单来说就是,什么人做什么事)
2.面向对象的三个特点:多态、继承、封装
2.1多态 :指同一种事物的不同形态,公共接口
特点:增加 了代码的灵活性,减少代码冗余
# python崇尚鸭子类型:一只鸟,走路像鸭子,游泳像鸭子,那么他就是鸭子
# 鸭子类型,只关注对象的属性,不关注他的本质
class PAY:
pass
class ZHIFUBAO(PAY):
name = "zhifubao"
def pay(self):
print("this is zhifubaopay")
class WEIXIN(PAY):
name = "weixin"
def pay(self):
print("this is weixinpay")
z1 = ZHIFUBAO()
w1 = WEIXIN()
def moneypay(obj):
print(f"this is {obj.name}")
obj.pay()
moneypay(z1)
moneypay(w1)
# moneypay就是一个公共接口
2.2 继承 :子类可以继承父类的一切属性和方法,继承的目的是为了提高代码的复用率
class A:
def __init__(self, count):
self.name = "class A"
print(f"this is a.count {count}")
def sum(self, a, b):
print(a+b)
# 定义一个A的子类B
class B(A):
print("this is B")
# 执行完print后就会调取A的init函数
# B继承了A的所有属性和方法
# B没有init函数,会自动取调用A的init函数,
# B实例化对象的时候也要传一个参数,不然就会报错,缺少一个必要的值
b = B("1")
b.sum(1, 2)
# this is B
# this is a.count 1
# 3
# 一个类可以同时继承多个类,也可以继承多重类
# 定义一个B的子类C,C不仅继承了b的所有属性和方法,也继承了A的所有属性和方法
class C:
def __init__(self, count):
# c想要重写init函数,但是也想拥有A的init函数的属性时就可以调用super方法
# 最好将super方法写在定义方法的下一排,避免修改的属性被重写
super().__init__(count)
print("this is c.init")
c = C("1")
2.3 封装 :将属性和方法封装成类,用户不需要关心如何实现的功能,只需要关心如何去使用这个类
# 类型的判断,适用于所有判断
# 判断实例化对象是否属于一个类
# print(isinstance(a, A))
# 判断100是否是int型数据
# print(isinstance(100, int))
3.类的定义
定义类的时候我们呢一般以大驼峰的形式,每一个单词首字母大写
定义方法的时候我们多以下划线的方式来隔开每一个单词
# 类:具有相同属性或方法的集合
# 属性:描述对象的具体信息
# 方法:具备的功能
# 对象:一个实例,某个类实例化后的结构体
# 类的定义:
class User:
# 属性
name = "xiaoyu"
country = "China"
# 方法
def money(self,balance):
self.balance = balance
print(f"xiaoyu现在有{self.balance}元")
# 实例化对象
user1 = User()
# A 和A() 是两个类
class A():
def info(self):
print("hello")
print(f"A().id is {id(A())}")
print(f"A().id is {id(A)}")
# A().id is 2494555864896
# A().id is 2494557331024
(定义类的时候最好不要加括号)
现在我们以一个银行的例子,一起走进面向对象的世界:
1.首先我们定义了一个银行类:它有info、country、total_money这三个属性和store_Money(存钱)的方法,我们实例化了两个ATM类的对象,分别是A1和a2,我们的系统在生成这两个对象的时候同时在内存里为这两个对象分别开辟了一块内存空间,存放对象的属性。
实例化虽然调用了类,但是如果没有基于类属性或者类方法执行一些命令,实例的内存空间不存放任何东西。
实例查找属性时: 1.先在自己的内存空间查找内容 2.如果没有找到就去类空间查找属性 3.如果类空间还是没有这个属性就去父类空间找 4.如果父类空间还是找不到这个属性就去父亲的父亲的空间查找,直到找到最上一层的基类
实例可以访问类空间的属性和方法,但是不能通过实例,修改类空间的值
4.我们为什么要从面向过程过渡到面向对象:
面向过程适合于小项目开发,项目不需要太多的维护,并且没有项目迭代的时候使用。但是如果你要设计一个较大的项目,并且项目迭代跟新比较频繁的话采用面向对象的方式编程会提高很大的效率,同时也较少了成本