面向对象
什么是面向对象
以前的编程我们把它称为“面向过程的编程”
重点在于:做什么
现在的编程我们把它称为“面向对象的编程”(oop)
重点在于:谁去做
类
用来描述具有相同属性或者方法的对象的集合
属性:对象的描述形象
方法:对象的行为
类的特性是:封装、继承、多态
封装
-
在类中对数据的赋值、内部调用对外部用户是透明的
-
把一些功能的实现细节不对外暴露
继承
-
继承:即一个派生类(derived class)继承基类(base class)的字段和方法。
-
为实现代码的重用, 一个类可以派生出子类
-
继承也允许把一个派生类的对象作为一个基类对象对待。
多态
-
接口重用
-
一个接口,多种实现(重写)
对象(实例)
具体的某个事物,实实在在的一个例子
实例化:创建一个类的实例
面向对象的优点
-
迭代更新方便
-
结构清晰、易于管理
class ATM():
#属性
money = 50000
country = "China"
bank = "gonghang"
#方法
def get_money(self,money):
print(f"get money:{money}")
#实例化:创建一个类的实例
a1 = ATM()
a2 = ATM()
print(dir(a1))
#属性访问
print(a1.money,a2.country)
a1.get_money(500)
类的定义和使用
命令规范
一般首字母大写(大驼峰式命令)例如:Person,GoodsInfo
定义关键字:class
python2 ==》经典类,新式类
python3 ==》 新式类
python2显示object的类是新式类,没有就是经典类(python3默认是新式)
class A:
pass
class B():
pass
class C(object):
pass
类空间和实例空间
class ATM():
#属性
money = 50000
country = "China"
bank = "gonghang"
#方法
def get_money(self,money):
print(f"get money:{money}")
#实例化:创建一个类的实例
a1 = ATM()
a2 = ATM()
print(dir(a1))
#属性访问
print("实例访问".center(20,"*"))
print(a1.money,a2.country)
a1.get_money(500)
print("类访问".center(20,"*"))
print(ATM.money)
print("="*30)
a1.area = "hunan"
print(a1.area)
# print(a2.area) #没有,上面只是a1添加了,但是ATM没有添加,所以a2没有,指针可以引用类空间,但是不能改变
ATM.color = "blue" #ATM 添加了color所以a1和a2都会有
print(a1.color,a2.color)
#类空间 和 实例空间
print("类空间".center(30,"*"))
print(ATM.__dict__)
print("a1的空间".center(30,"*"))
print(a1.__dict__)
print("a2的空间".center(30,"*"))
print(a2.__dict__)
a1.money = 20000
print(a1.money,a2.money)
#实例只能引用类,不能改变类
类创建的时候会生成类空间
实例化对象生成实例空间,不同的实例之间,空间都是独立的
实例查找属性方法的时候,会先在实例空间查找,找不到就去类空间查找
类空间找不到,就去父类空间找
实例空间会有一个父对象指针,通过这个指针实例就可以访问类的属性方法了
__init__
方法
实例对象的构造方法(初始化方法)
实例化对象的时候自动调用__init__
方法
class ATM():
#属性
money = 50000
country = "China"
bank = "gonghang"
def __init__(self,area):
#实例属性
self.area = area
#方法
def get_money(self,money):
print(f"get money:{money}")
#实例化
atm1 = ATM("hunan")
atm2 = ATM("hubei")
print(atm1.area,atm2.area)
__new__
方法
创建实例的方法 ,一般情况下不需要重写
总结
__new__
是创建实例的方法 __init__
是创建好的实例进行初始化的方法
__new__
方法必须要传入一个参数(cls),代表当前类 __new__
必须返回一个实例对象 __init__
的self就表示__new__
返回的实例,__init__
在对这个实例进行初始化工作 子类没有定义__new__
,就会找父类的__new__
新式类才有__new__
如果实例化对象和本身class不一致,__init__
不会执行 __new__
方法属于静态方法 __init__
方法属于实例方法
单例模式
无论是实例化多少次,都返回同一个对象实例